如何让对象只能处于堆中

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;
    }
}
在实际中,上述的方法,都是不可行的。
一般的策略是通过地址空间来判断。但这就依赖于操作系统。一句话,想搞出一个通用的解决方案,这个问题的答案就是:
没得搞!
原文地址:https://www.cnblogs.com/CUCmehp/p/1376538.html