Итак, чтобы проиллюстрировать мой вопрос, я сделал пример:
#include <iostream>
using namespace std;
struct A
{
void doSomething (){
cout << "Something\n";
}
};
struct B
{
A a;
A *getA ()
{
return &a;
}
};
int
main ()
{
B *b = new B ();
A *a = b->getA ();
// POINT 1
if (nullptr != a)
{
a->doSomething ();
}
delete b;
b = nullptr;
// POINT 2
if (nullptr != a)
{
a->doSomething ();
}
return 0;
}
Это компилируется и запускается без ошибок на моей машине, но если вы проверяете код, действительно существует проблема с висящим указателем настроки, следующие за комментарием с пометкой «POINT 2».
Так как b
был удален, то a
теперь недействителен (так как он был удален dtor из b
).
Таким образом, я мог бы использовать общий указатель, чтобы исправить это, но это сохранило бы экземпляр a
даже после удаления b
, а также я не смог бы выделить a
в стеке.Это две вещи, которые я хочу избежать.Вместо этого я просто хочу узнать, действителен ли a
.
Я мог бы также использовать уникальный указатель, но тогда я мог бы иметь только один единственный экземпляр a
, который тоже не тот, который я хочу, янужно много копий указателя на a
.
Так есть ли какой-нибудь существующий тип указателя / ссылки, который позволил бы мне сделать это?Есть ли причина, почему это хорошая / плохая идея?