如何让类对象只在栈(堆)上分配空间?
只能在堆上分配
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()
{}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!