Может ли кто-нибудь сказать мне, как элемент 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";
}
Проблема в том, что вы не реализовали оператор присваивания. Поэтому, когда вы это делаете
s = "abc";
вы получаете два объекта String
(один из них временный), удерживающий указатель на тот же адрес. Они оба пытаются удалить один и тот же объект. Вы должны следовать правилу три.
Примечание: как отметил @kolrabi, вы должны free
вызов указателем, выделенным с помощью strdup
, а не delete
.
Пусть проанализируют s = "abc"
:
Прежде всего, это назначение, а не экземпляр, потому что s
уже объявлен.
Таким образом, решение для компиляции для этого было бы создать временный объект String
с "abc"
в качестве аргумента для конструктора String
, а затем вызвать оператор присваивания String
, чтобы скопировать этот временный объект в s
.
Теперь, поскольку вы не реализовали оператор присваивания для этого класса, вызывается оператор присваивания по умолчанию и просто копирует каждую из переменных-членов из временного объекта String
в s
.
Наконец, временный объект String
уничтожается, а память, указанная его переменной m
освобождается. В результате вы получаете sm
указывающий на недопустимый кусок памяти.