Если deleteTest
хочет использовать указатели, возможно, пропавших объектов, оно должно содержать std::weak_ptr
с.
Держать необработанный указатель и разыменовывать его позже опасно (если только вы не можете убедиться, что объект еще жив, a.k.a не используйте необработанные, но умные указатели).
[...] Я не могу изменить сигнатуру этой функции и каждой функции
Итерации цикла, я должен инициализировать указатель. Есть ли способ предотвратить утечку памяти в таком случае?
Если вам нужны динамически размещаемые объекты, используйте умные указатели (например, std::smart_ptr
для совместного владения). Если вам не нужно их динамически распределять, не делайте этого.
Для примера давайте предположим, что вы не можете изменить deleteTest
, тогда для целых чисел нет причин динамически выделять что-либо
int main()
{
std::array<int,10> x;
testDelete tD;
for (int i=0;i<10;i++)
{
x[i] = i+1;
tD.setValue(&x[i]);
}
tD.getValue();
return 0;
}
Возьмите этот код с крошкой соли, на самом деле это deleteTest
, который нужно исправить, чтобы избежать проблем.
TL; DR
В вашем примере у вас на самом деле две проблемы. deleteTest
может попытаться получить доступ к уже пропущенным объектам и утечкам памяти в main
. Использование умных указателей решает оба вопроса.