首页 > 试题广场 >

c++中,限制一个类的对象实例,只能在堆上分配,或者只能在栈

[问答题]
c++中,限制一个类的对象实例,只能在堆上分配,或者只能在栈上分配,有什么方法没?
推荐
palcement new 可以实现在指定地址分配对象
这里参考网上,采用单例模式
堆上:
把构造函数设置为private, 这样栈上定义对象会导致编译报错,然后另外提供接口比如create来创建对象
栈上:
重载 void * operator new(size_t s), 使之访问属性为 private,这样new 的外在调用会导致编译失败
编辑于 2015-02-07 16:36:57 回复(0)
//只能在堆上分配对象并且可以实现继承
class Test_Heap{
protected:
    Test_Stack(){};
    ~Test_Stack(){};
public:
    static Test_Stack* create(){
         return new Test_Stack();
    }
    void destroy(){
        delete this;
    }
};

//只能在栈上分配对象并且可以实现继承
class Test_Heap{
private:
    void* operator new(size_t t){};
    void operator delete(void* ptr){};
public:
    Test_Heap(){};
    ~Test_Heap(){};
};

发表于 2015-10-25 16:29:17 回复(0)
限制 只能 栈上分配:  重载了new运算符,并设为私有。
限制 只能 堆上分配 :将构造函数设置为私有。
发表于 2015-01-13 15:14:29 回复(2)
1、只在堆上建立对象,还是只能将析构函数设为private(其实更准确应该是protected),不能简单地将构造函数设为private。
2、只在栈上建立对象,重载new运算符,设为private,最好把delete也一起重载了。
编辑于 2017-08-29 09:42:44 回复(0)

class CSingleton  
{  
    public:  
    static CSingleton * GetInstance()  
    {  
        if(NULL == m_pInstance)  
            m_pInstance = new CSingleton();  
        return m_pInstance;  
    }  
    static void Release()   //必须,否则会导致内存泄露  
    {  
        if(NULL != m_pInstance)  
        {  
            delete m_pInstance;  
            m_pInstance = NULL;  
        }  
    }  
    protected:  
        CSingleton()  
        {  
            cout<<"CSingleton"<<endl;  
        };  
        static CSingleton * m_pInstance;  
};  
CSingleton* CSingleton::m_pInstance = NULL; 
编辑于 2016-07-07 20:19:11 回复(0)
http://blog.csdn.net/szchtx/article/details/12000867
 因此,将析构函数设为私有,类对象就无法建立在栈上了,这种方法我在c++primer看到的一样
发表于 2015-09-25 17:24:14 回复(0)