如何知道对象创建是堆还是不堆?
问题描述:
我们希望在低延迟系统上工作,堆分配在应用程序中成本较高。但是在某种程度上允许在堆上创建对象。这就是为什么我们想要指示对象是否被创建在堆上?如何知道对象创建是堆还是不堆?
下面的方法是找出在堆内存上创建的对象的正确方法。
将有泛型类,其中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类在实例化基类对象时使用新的&删除操作符调用。
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;
}
答
请注意,您的方案悲惨只要一个MyClass
对象失败是一个子对象可能会或可能不会通过动态分配的另一个对象的(继承或包含)。 (并且我知道用于防止动态分配的技巧也会失败。)
因此,您所做的只是进一步减慢了堆分配而没有获得太多。除少数非常罕见的情况外,如果某个对象被分配了,则该类别的内容为'用户决定。
如果他们认为他们需要动态分配一个,你不同意谁?
任何数量的分配器调试方案也会导致指针不完全匹配。因此'set'是不合适的。但是,应该可以通过存储每个分配的大小并在搜索中使用该信息来查明“this”是否属于任何分配的区域。根据代码的可移植性,可以使用底层分配器的堆栈行为API,而不是冗余地存储块信息。 – 2010-12-19 16:29:08