对象如何知道它是否已在堆栈或堆上分配?

时间:2011-08-22 11:38:16

标签: c++ constructor memory-management

  

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

2 个答案:

答案 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
}

修改: 上述解决方案提供了一种方法来了解变量是自动的(通常在堆栈/数据段上)还是动态的(通常在堆段上)。