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

只能在堆上分配

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 @ 2022-04-27 15:12  天下太平  阅读(204)  评论(0)    收藏  举报