Ваша терминология вызывает двусмысленность, но позвольте мне объяснить.Допустим, у вас есть:
struct foo
{
void* bar;
};
Всякий раз, когда foo
заканчивает свое время жизни, bar
просто перестает существовать.Так что если у вас есть:
{
foo f = { new int; }
}
Вы просочились, так как new int
никогда не удаляется.Аналогично, когда вы делаете:
{
foo* f = new foo;
f->bar = new int;
delete f;
}
Вы все еще просочились, так как, когда запускается delete f
, вы просто заканчиваете время жизни того, на что указывает f
(точно так же, как это произошло автоматически выше)ergo bar
просто перестает существовать и new int
не удаляется.
Подводя итог, когда заканчивается время жизни объекта, delete
- это , а не , который вызывается для членов, которыеуказатель.
Таким образом, когда вы вызываете delete для Link
, это та же самая ситуация, что и bar
в foo
выше: вы удаляете память для Link
, вызывая data
впрекратить существование, но не удалять то, на что оно указывает.