Единственный способ, с помощью которого я знаю, это делать с полубезопасностью, если вы можете перегрузить operator new
для типа, для которого вам нужно это сделать. К сожалению, здесь есть несколько серьезных подводных камней, и я не могу вспомнить, что они из себя представляют.
Я знаю, что одна ловушка состоит в том, что что-то может быть в куче без непосредственного распределения. Например:
class A {
int data;
};
class B {
public:
A *giveMeAnA() { return &anA; }
int data;
A anA;
};
void foo()
{
B *b = new B;
A *a = b->giveMeAnA();
}
В приведенном выше коде a
в foo
заканчивается указателем на объект в куче, который не был выделен с помощью new
. Если ваш вопрос действительно «Как я могу узнать, могу ли я позвонить delete
по этому указателю». перегрузка operator new
, чтобы сделать что-то хитрое, может помочь вам ответить на этот вопрос. Я все еще думаю, что если вам нужно задать этот вопрос, вы сделали что-то очень неправильное.