如何让类对象只在栈(堆)上分配空间?

只能在堆上分配

class A {
public:
    A() {}
    void destory() { delete this; }
private:
    ~A() {}
};

编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。

若是类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。

如果在栈空间分配,会提示类的析构函数不可访问。


下面的写法更优。

代码看起来更统一,调用create函数在堆上创建,调用destory函数来释放。

class A  
{  
protected:  
    A(){}  
    ~A(){}  
public:  
    static A* create()  
    {  
        return new A();  
    }  
    void destory()  
    {  
        delete this;  
    }  
};

只能在栈上分配

class A  
{  
private:  
    void* operator new(size_t t){}    // 注意函数的第一个参数和返回值都是固定的  
    void operator delete(void* ptr){}
public:  
    A(){}  
    ~A(){}  
};

只有使用new运算符,对象才会创建在堆上,所以,只要禁用new运算符就能够实现类对象只能创建在栈上。

一个事实:new operator 先调用 operator new,所以,将operator new()设为私有便可禁止对象被new在堆上。

如果在堆空间分配,会提示operator new不可访问。


上面的方式,可以在全局空间创建对象。

构造函数私有化,提供一个接口创建栈对象。

class StackOnly
{
public:
	static StackOnly CreateObject()
	{
		return StackOnly();
	}
private:
	StackOnly()
	{}
};
posted @   天下太平  阅读(170)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示