对象如何知道它是在堆栈上还是在堆上分配的

How can an object know if it has been allocated on the stack or the heap?

本文关键字:分配 何知道 对象 堆栈      更新时间:2023-10-16

可能重复:
如何判断一个对象是在构造函数上静态分配还是动态分配的?

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的构造函数能区分这两种情况吗?

这个问题的简短答案是否定的。

有一些理论上的解决方案,例如,您可以替换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( 您可能需要放置一个标志(作为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
}

编辑:上述解决方案提供了一种方法,可以知道变量是自动的(通常在堆栈/数据段上(还是动态的(通常是在堆段上(。