如何知道对象创建是否在堆上..?

时间:2010-12-19 15:57:30

标签: c++ memory-management heap

我们希望在低延迟系统上工作,堆分配在应用程序中更昂贵。但是在某种程度上允许在堆上创建对象。这就是为什么我们想要指示是否在堆上创建对象..?

以下方法是找出在堆内存中创建的对象的正确方法吗?

将具有泛型类,其中new和delete运算符被重载以维护堆分配的指针....

#include <iostream>
#include <set>

using namespace std;

class MemStat              //base class
{
    typedef set<MemStat*> POINTERS; 
    static POINTERS m_ptrlist;
public:
    void* operator new (size_t size)
    {
        MemStat* ptr = ::new MemStat;
        m_ptrlist.insert(ptr);
        return ptr;
    }
    void operator delete(void* dptr)
    {
        MemStat* ptr = static_cast<MemStat*>(dptr);
        m_ptrlist.erase(ptr);
        ::delete ptr;
    }
    // void* operator new[] (size_t sz);
    // void operator delete[] (void*);

    bool is_on_heap() { m_ptrlist.find(this) != m_ptrlist.end(); }

protected:             // ctor & dtor are protected for restrictions
    MemStat() { }
    virtual ~MemStat() { }
    MemStat(const MemStat&) { } 
    const MemStat& operator=(const MemStat& ) { return *this; }
};
MemStat::POINTERS MemStat::m_ptrlist;

对于我们需要检查堆创建的最终用户类,将从MemStat类中派生出来使用new&amp;在实例化基类对象时删除操作符调用。

class MyClass : public MemStat   //end user class
{
};

int main()
{
    MyClass* myptr = new MyClass;
    MyClass obj;

    cout << myptr->is_on_heap() << endl;    //results into yes
    cout << obj.is_on_heap() << endl;       //reults into no

    delete myptr;
}

1 个答案:

答案 0 :(得分:6)

请注意,只要MyClass对象是另一个对象(继承或包含)的子对象(可能会或可能不会动态分配),您的方案就会失败。 (我知道防止动态分配的技巧也会在那个上失败。)

所以你正在做的只是进一步减慢堆分配而不会增加太多。除了一些非常罕见的情况,分配对象是您的班级“ 用户 决定的。” 如果他们认为他们需要动态地分配一个,你是谁不同意?

相关问题