首页 > 其他分享 >如何限制类对象只能建立在堆上或者栈上?

如何限制类对象只能建立在堆上或者栈上?

时间:2023-10-18 14:44:53浏览次数:27  
标签:调用 限制 函数 对象 void 栈上 new 构造函数 delete

整理至:链接

在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A ptr=new A;这两种方式是有区别的。

  • 栈上:编译器在栈上分配内存,然后调用构造函数初始化内存空间
  • 堆上:调用new分配合适的堆内存,然后调用构造函数初始化内存空间

1、只能建立在堆上

方法一:将构造函数设置为私有,这是不行的。因为operator new()函数只用于分配内存,无法提供构造功能,当构造函数设置为私有,就无法初始化内存。
方法二:将析构函数设置为私有(需要自定义一个内存释放函数),这是可以的。因为编译器在栈上创建对象时,会检查析构函数是否可以被调用,如果不可以被调用,那么就不可以调用创建栈上对象。

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

如果A作为其它类的基类,则析构函数通常要设为virtual,然后在子类重写,以实现多态。因此析构函数不能设为private。所以析构函数一般设置为protected:

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

2. 只能在栈上分配类对象

禁用new就可以了。【注】重载了new就需要重载delete。

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

标签:调用,限制,函数,对象,void,栈上,new,构造函数,delete
From: https://www.cnblogs.com/codingbigdog/p/17772298.html

相关文章

  • SpringBoot限制接口访问频率
    功能说明可以通过注解快速实现类似一段时间内仅可以搜索N次,或一段时间内只能点赞N次,以及一段时间内尝试登陆多次即被禁止一小时等类似功能。github地址中文文档第一步:添加Maven依赖<dependency><groupId>io.github.liuye744</groupId><artifactId>simpleAuth-sprin......
  • Java(Spring) 通过反射classforName获取对象实例导致@Autowired注入失效
    使用策略模式多态获取具体的策略问题描述:classforName在代码中使用反射获取对象实例后,对象实例中通过@Autowrite注解注入的属性值为null(注入失败),导致带反射获取的对象实例调用方法时出现空指针等情况。问题原因:通过反射获取对象实例相当于“new”了一个对象,所以这个对象并没有被......
  • JAXB实现对象与xml互转
    importjava.io.ByteArrayOutputStream;importjava.io.InputStream;importjava.io.StringReader;importjava.nio.charset.StandardCharsets;importjavax.xml.bind.JAXBContext;importjavax.xml.bind.JAXBException;importjavax.xml.bind.Marshaller;importjavax......
  • 实验1 类和对象
     task1.cpp#include<iostream>#include<string>#include<vector>#include<array>template<typenameT>voidoutput1(constT&obj){for(autoi:obj)std::cout<<i<<",";std::cout<<"......
  • 实验一 类与对象_基础编程1
    task1.cpp1#include<iostream>2#include<string>3#include<vector>4#include<array>56template<typenameT>7voidoutput1(constT&obj){8for(autoi:obj)9std::cout<<i<<","......
  • 你的Github账户可能被封禁!教你应对Github最新的2FA二次验证! 无地区限制, 无额外设备
    12FA的定义双因素身份验证(2FA)是一种身份和访管理安全方法,需要经过两种形式的身份验证才能访河资源和数据,2FA使企业能够监视和帮助保护其最易受攻击的信息和网络。22FA的身份验证方法使用双因素身份验证时有不同的身份验证方法。此处列出了一些最受欢迎的选项。2.1硬......
  • 金蝶云星空业务对象自定义按钮进行权限控制
     金蝶云星空业务对象自定义按钮进行权限控制一、背景说明金蝶标准:权限绑定操作,操作绑定按钮。实际需求:按钮不绑定操作,直接验权二、创建按钮2.1菜单集合  2.2列表菜单 三、创建权限项  四、添加权限项到权限对象 五创建公共权限服务usingKingdee.B......
  • Java拾贝第四天——String和匿名对象
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么复习突然发现String没写匿名对象只在堆内存中开辟空间,栈内存中没有对其进行引用的一种对象。(会等待被GC清除)publicclassTest4{publicstaticvoidmain(String[]args){newNoname("匿名对象");}}......
  • 彻底搞懂:防止表单重复提交,前端限制还是后端限制?
    欢迎大家来到小米的技术分享专栏!今天我将为大家带来一个热门话题:如何有效地防止表单重复提交。在开发中,我们常常会遇到这样的问题:用户频繁点击提交按钮,导致数据重复提交,给系统和用户体验带来不必要的困扰。那么,在前端还是后端进行限制措施,哪个更好呢?让我们一起深入探讨。前端限制:防......
  • window对象和vuex
    保存在window对象中可以作为全局组件通信的媒介,不过这种方式不具备响应性能力,所以数据更时无法直接通知订阅数据的组件更新。使用vuex.保存数据与window保存的原理一样,都是借助了全局对象进行数据互通,不同的是vuex通过订阅发布机制可以将vue数据的更新通知到所有订阅状态的组件......