more effective C++提出了只能将对象分配在堆中的问题。
原理1是,让对象被分配时,都是先调用对象中的operator new(size_t size)方法获得原生的内存,然后再调用对象的构造方法。因而可以重载类的operator new方法。但这种方法不能防止程序通过operator new[](size_t size)分配内存。
实现代码如下:
//non-heap object
class A{
private:
static bool isHeap;
public:
static class NoHeapException{};
A(){
if(!isHeap){
throw NoHeapException();
}
cout<<"heap object"<<endl;
isHeap=false;
}
static void* operator new(size_t size){
isHeap=true;
return ::operator new(size);
}
};
bool A::isHeap=false;
int main(){
A* test=new A;
try{
A();
}catch(A::NoHeapException exc){
cout<<"catch an non-heap object"<<endl;
}
}
class A{
private:
static bool isHeap;
public:
static class NoHeapException{};
A(){
if(!isHeap){
throw NoHeapException();
}
cout<<"heap object"<<endl;
isHeap=false;
}
static void* operator new(size_t size){
isHeap=true;
return ::operator new(size);
}
};
bool A::isHeap=false;
int main(){
A* test=new A;
try{
A();
}catch(A::NoHeapException exc){
cout<<"catch an non-heap object"<<endl;
}
}
在实际中,上述的方法,都是不可行的。
一般的策略是通过地址空间来判断。但这就依赖于操作系统。一句话,想搞出一个通用的解决方案,这个问题的答案就是:
没得搞!