Конструктор преобразования

0

Может ли кто-нибудь сказать мне, как элемент char * удаляется после вызова конструктора преобразования.

Результатом является отказ от Debug Assertion

class String
{
public:
    char* m;
    String()
    {
        m = NULL;
    }
    String(const char* str)
    {
        m = strdup(str);
    }
    String(const String& I)
    {
        m = strdup(I.m);
    }
    ~String()
    {
        delete m;
    }
};


void main()
{
    String s;
    s = "abc";
    s = "bcd";
}
Теги:
type-conversion
casting
destructor

2 ответа

4

Проблема в том, что вы не реализовали оператор присваивания. Поэтому, когда вы это делаете

s = "abc";

вы получаете два объекта String (один из них временный), удерживающий указатель на тот же адрес. Они оба пытаются удалить один и тот же объект. Вы должны следовать правилу три.

Примечание: как отметил @kolrabi, вы должны free вызов указателем, выделенным с помощью strdup, а не delete.

  • 0
    Я проголосовал против, но вы могли бы быть менее ** в комментариях.
  • 1
    @StoryTeller Справедливо, извините!
Показать ещё 1 комментарий
1

Пусть проанализируют s = "abc" :

Прежде всего, это назначение, а не экземпляр, потому что s уже объявлен.

Таким образом, решение для компиляции для этого было бы создать временный объект String с "abc" в качестве аргумента для конструктора String, а затем вызвать оператор присваивания String, чтобы скопировать этот временный объект в s.

Теперь, поскольку вы не реализовали оператор присваивания для этого класса, вызывается оператор присваивания по умолчанию и просто копирует каждую из переменных-членов из временного объекта String в s.

Наконец, временный объект String уничтожается, а память, указанная его переменной m освобождается. В результате вы получаете sm указывающий на недопустимый кусок памяти.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню