可能重复:
How can I tell if an object is statically or dynamically allocated on the constructor?
struct Foo {
Foo ();
};
int main ()
{
Foo foo; // Case A
Foo * p_foo = new Foo (); // Case B
}
Foo :: Foo ()
{
if (allocated_on_stack) {
// Case A
}
if (allocated_on_heap) {
// Case B
}
}
Foo的构造函数可以区分这两种情况吗?
答案 0 :(得分:2)
对这个问题的简短回答是否定的。
有理论上的解决方案,例如你可以替换new
(在类或全局级别上)并跟踪所有new
分配的指针,并将此列表与this
指针进行比较在构造函数中。
struct Foo {
Foo ()
{
//Check if `this` is in s_instances
}
void* operator new(size_t size)
{
void* pointer = ::new(size);
s_instances.push_back(pointer);
return pointer;
}
void operator delete (void* pointer)
{
//remove from s_instances and call global delete
}
static std::vector<void*> s_instances;
};
(此代码不会捕获用new Foo[count]
分配的Foo)
为什么你需要这个?
答案 1 :(得分:-1)
没有独立于平台的方式。用户定义的方法很少。其中很少是,
(1)您可能需要放置一个标志(作为private
变量)并检查相同的内容。
struct Foo {
const bool isHeap;
Foo (bool heap = false) : isHeap(heap) {}
};
(2)保持内部超载new
。
struct Foo {
static set<Foo*> heap;
void* operator new (size_t size)
{
void *p = malloc(size);
heap.insert(<p inside this set>);
}
};
Foo :: Foo ()
{
// check heap.find() for heap allocation
}
修改强>: 上述解决方案提供了一种方法来了解变量是自动的(通常在堆栈/数据段上)还是动态的(通常在堆段上)。