Вам просто нужно использовать std :: shared_ptr и std :: weak_ptr .
shared_ptr
настолько умны, что вам не нужно их удалять, они будут удалены, когда никто больше на них не ссылается. Тогда любой weak_ptr
, связанный с этим shared_ptr
, будет в некотором роде проинформирован, и у него нет риска получить доступ к нераспределенной памяти.
Когда это необходимо, weak_ptr
попытается lock()
и создаст локальный shared_ptr
. Если исходный shared_ptr
был удален, lock()
не сможет создать локальный shared_ptr
, и вы будете уверены, что исходный указатель был удален.
// Example program
#include <iostream>
#include <assert.h>
#include <memory>
int main()
{
std::shared_ptr<int> pI( new int(3) );
std::weak_ptr<int> wI( pI );
{
// check if weak_ptr still "points" to some valid data:
std::shared_ptr<int> pICopy = wI.lock();
assert( pICopy != NULL );
std::cout << "pI still valid " << *pICopy << std::endl;
}
pI.reset(); // this is equivalent to regular delete with shared_ptr
{
// check if weak_ptr does not "point" to any valid data:
std::shared_ptr<int> pICopy = wI.lock();
assert( pICopy == NULL );
std::cout << "pI not valid anyore" << std::endl;
}
}