У меня есть класс, который выделяет память и может вызвать исключение в конструкторе, например:
class A
{
int *x;
public:
A () { x = new int; throw 0;}
~A () { delete x; }
};
Я хочу создать объекты такого класса динамически.Как мне сделать это, чтобы предотвратить утечки памяти?Я пытался создать объекты в блоке try
и удалить в блоке catch
, но адрес-дезинфицирующее средство сообщило SEGV on unknown address
.
int main()
{
A *a;
try { a = new A; }
catch(int) { delete a; } // AddressSanitizer: SEGV on unknown address
}
Без удаления имеющегося у нас объекта (очевидно) утечка памяти и средство для очистки утечки сообщает, что.
int main()
{
A *a;
try { a = new A; }
catch(int) {} // LeakSanitizer: detected memory leaks
}
Однако без try - catch
оба дезинфицирующих средства молчат.Мне интересно, есть ли еще утечка памяти и, если да, как ее исправить?
int main()
{
A *a;
a = new A; // terminate called after throwing an instance of 'int'
}
UPD: Да, я знаю об общих указателях.Мой вопрос в основном о последнем случае (без обработки исключения).Почему дезинфицирующие средства молчат?Это просто утечка или дезинфицирующее средство?