У вас есть множество проблем, которые я смог увидеть, как в вашем реальном коде, так и в вашем общем подходе.
Прежде всего, символ * title
не удаляется, потому что вы его не удаляете. Вероятно, это логическая ошибка:
if (p)
{
cout<<"deleting p"<<endl;
delete p;
}
else if(title)
{
cout<<"deleting title"<<endl;
delete[] title;
}
Вам, вероятно, не нужен else
. Почему ты положил это туда?
Далее вы пропускаете int
, здесь:
p = new int;
p = temp;
int
, который вы только что new
-ed, перезаписывается переданным значением temp
.
Позже вы пытаетесь удалить этот указатель в деструкторе. Но так как вы удаляете указатель на автоматическую переменную, вы будете использовать эту кучу. Это тоже логическая ошибка. Решение: не делайте этого: p = temp;
В конечном счете, однако, ваш подход сомнителен на нескольких уровнях.
- Почему вы динамически выделяете
int
с в первую очередь? Просто имейте int
члена класса. Не используйте динамическое распределение (например, new
и delete
), если только действительно не потребуется.
- Не выделять строки динамически, используя
char*
s. Вместо этого используйте std::string
из #include <string>
- Если вам действительно нужно динамическое распределение, не используйте необработанные указатели. Вместо этого используйте умные указатели. C ++ поставляется с одним встроенным
std::auto_ptr
из #include <memory.h>
, но в других библиотеках есть много других, часто более удачных вариантов. Популярным здесь являются умные указатели Boost.