C 对象创建仅限于堆或堆栈

小夏 科技 更新 2024-02-12

如何限制类的对象只能在堆上创建? 如何限制仅在堆栈上创建对象?

注意:在 C++ 中为类创建对象有两种类型:静态建立,动态建立

静态建立:编译器在堆栈空间上为对象分配内存,并直接调用类的构造函数来创建对象。 例如:a a;

动态建立:使用 new 关键字在堆空间上创建一个对象,底层首先调用算子 new() 函数在堆空间上找到合适的内存并分配; 然后,调用类的构造函数来创建对象。 例如:a *p = new a();

受限制的对象只能在堆上生成:

最直观的想法:避免直接调用类的构造函数,因为当对象是静态建立的时,会调用类的构造函数来创建对象。 但是,将类的构造函数设为私有是不可行的,因为当构造函数设置为私有时,不能在类外部调用构造函数来构造对象,只能新调用构造函数来构造对象。 但是,由于在创建对象时,类的构造函数也是在 new 的底部调用的,因此在将构造函数设置为 private 之后,无法使用 new 在类之外创建对象。 因此,这种方法是不可行的。 解决方法 1:

将析构函数设置为私有。原因:静态对象建立在堆栈上,编译器分配和释放内存空间,编译器为对象分配内存空间时,检查类的非静态函数,即编译器检查析构函数的可访问性。 当析构函数设置为 private 时,编译器创建的对象无法访问析构函数来释放对象的内存空间,因此编译器不会为堆栈上的对象分配内存。

class a void destory() private: ~a()
该方法的问题:

使用 new 创建的对象通常使用 delete 来释放对象的内存空间,但析构函数不能从类外部调用,因此必须在类中定义一个 destory() 函数来释放由 new 创建的对象。 没有办法解决继承问题,因为如果将类用作基类,则将析构函数设置为虚拟,然后在派生类中重写函数以实现多态性。 但是在这一点上,析构函数是私有的,在派生类中不可访问。 解决方法 2:

将构造函数设置为 protected,并提供 public 的静态函数来完成构造,而不是在类外部使用新构造; 将析构函数设置为 protected。 原因:与单一实例模式类似,析构函数保证在派生类中可访问。 通过调用 create() 函数在堆上创建一个对象。

class a ~a() public: static a *create() void destory()
受限制的对象只能在堆栈上构建:

解决办法:将运算符 new() 设置为 private。 原因:当一个对象在堆上构建时,它是以一种新的方式创建的,底层会调用运算符 new() 函数,所以只要函数受到限制,就可以阻止该对象在堆上构建。

类 a 注意函数的第一个参数和返回值是固定的: void operator delete(void *ptr) { 如果重载 new,则需要重载 delete public: a() a()。

相似文章

    C 是面向过程的或面向对象的

    C 是一种多范式编程语言,支持面向过程和面向对象的编程。以下是 C 的特征 面向过程的编程 .程序 程序主要由一系列按一定顺序执行的进程 或功能 组成。.数据与函数分离 数据与函数分离,函数主要用于操作数据。面向对象编程 .封装 将数据和操作数据的方法封装在一个单元中,向外部隐藏实现细节。.继承 可...

    C919死了?美国技术限制只是暂时的,国内客机仍有光明的未来

    近日,有消息称,中国航空工业发展史上一个重大影响 C客机的研发可能夭折。但是,我们不必对这一消息过于悲观。事实上,从目前的情况来看,美国的技术限制只是暂时的,而国内客机的前景仍然光明。基于自主创新之路,中国航空工业展现出了强大的研发能力和坚定的决心。无论是技术实力的提升,还是市场需求的扩大,都为国产...

    欣克利角C揭示了创建萨默塞特盐沼的计划

    布里奇沃特附近Pawlett Hams拟建的盐沼将有益于当地的野生动植物和生物多样性。法国电力公司位于英国萨默塞特郡的欣克利角C核电站正在就帕雷特河上建造多英亩盐沼的计划征求建议。在布里奇沃特附近的波利瑟姆 Pollithams 拟建的盐沼将为鱼类和动物创造新的栖息地,改善当地的水质,并有助于防止洪...

    侃爷准备在中东创建自己的城市,“YZY DROAM”,占地10万英亩

    据外媒最新消息,侃爷正计划在中东打造自己的城市 YZY Droam 这座城市占地 , 英亩 约 平方公里 几乎是巴黎的四倍。周三 当地时间 侃爷进行了招聘 寻找项目经理 工程师 建筑师和承包商,以帮助他在中东建造一座新城市。根据招聘截图 该市目前处于 第一阶段 占地万英亩,约为巴黎的四倍,纽约的一半...

    男人约相亲在村口见面,看到这套衣服后,他纳闷你不冷吗

    相亲是年底无法回避的话题。无论是在城市还是在农村,美少女抢一把,女人的美取决于外表,七取决于穿着,在互联网的加持下,越来越多的农村女孩喜欢精致的风格。不知从什么时候开始,村里的姑娘们开始 卷 相亲,为了得到相亲男嘉宾的青睐,展现自己最好的一面。比如下面河南平顶山的网友发文,摄影师表示,回到村里后,他...