C++ 类何时在堆栈上实例化?

2023-12-05

我想澄清一下在堆栈上实例化类时会发生什么。

当 C++ 类在堆上实例化时:

MyClass *myclass = new MyClass();

创建 MyClass 类型的指针,并通过“new MyClass();”在同一行实例化该类。像这样拉伸它:

MyClass *myclass;
myclass = new MyClass();

如果我没有记错的话,在第一行创建一个指针,然后为第二行的实例分配内存,并将指向实例地址的指针分配给 myclass。

这是否意味着当一个类以这种方式在堆栈上实例化时:

MyClass myclass = MyClass();

它被创建了两次?


“栈”和“堆”在C++中没有定义,不需要在任何地方分配内存。

以你为例:

MyClass myclass = MyClass();

你正在初始化myclass通过复制构造函数到临时对象。myclass(和临时的)具有自动存储,如果您高兴的话,您可以考虑将其分配在“堆栈”上。

在这种情况下允许复制省略,本质上将其优化为MyClass myClass,但请注意,它不能总是这样做,例如当复制构造函数是私有的时。

这是您可以测试的示例:

struct obj {
  static int c;
  int myc;
  obj() : myc(c++) {
    std::cout << "ctor of " << myc << '\n';
  }
  obj(const obj&) : myc(c++){
    std::cout << "copy ctor of " << myc << '\n';
  }
  ~obj() {
    std::cout << "dtor of " << myc << '\n';
  }
};
int obj::c = 1;

int main(int argc, char** argv)
{
  obj x = obj();
}

如果副本被删除,您将看到:

ctor of 1
dtor of 1

否则(gcc选项 -fno-elide-constructors 来防止省略发生):

ctor of 1
copy ctor of 2
dtor of 1
dtor of 2

此外,将复制构造函数设置为私有会导致编译器错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 类何时在堆栈上实例化? 的相关文章

随机推荐

  • datetimepicker 类 - 具有 dts_appcanparse 样式 - 无法选择

    当用户完成编辑时 我得到 DTN USERSTRING 引出了一个问题 用户何时完成编辑 输入日期后 TAB 似乎没有生成此通知 我也没有得到 dtn keydown 或任何其他信息 鼠标或按 ALT 似乎可以解决问题 但我需要让 TAB
  • 带饼干的倒计时器

    我知道有很多这样的话题 但我只是遇到问题 找不到答案 我的脚本是 window onload function 200 seconds countdown var countdown 14400 current timestamp var
  • php htmlentities 解码文本区域

    我有一个文本区域 我想获取文本区域的输入并将其全部合并在一起 除了转义引号之外 一切都工作正常 例如test s输出为test s 为了解决这个问题 我尝试了 htmlenttries 例如 这应该根据html entity decode手
  • numpy中求两个多边形之间的距离

    我有两个多边形 P 和 Q 其中多边形的外部线性环由两个闭合的点集定义 存储为 numpy 数组 以逆时针方向连接 P和Q的格式如下 P x coords 299398 56 299402 16 299410 25 299419 7 299
  • jQuery - 选项上的选定属性未显示在 FireBug 中

    Why 当我在选择字段中选择一个选项时 selected selected 属性仍然保留之前的选项 但从视觉上你可以看到新选项处于活动状态 从下拉列表中选择一个选项不会修改selectedDOM 中的属性 但是如果您使用以下命令查询当前值
  • mysqli 连接在函数内不起作用? [复制]

    这个问题在这里已经有答案了 我在 php 函数内执行 mysql 查询时遇到一些问题 我得到的错误是 Notice Undefined variable link in C path api inc restFunctions php on
  • 从 AVI 捕获 OpenCV 帧

    我正在使用 openCV 2 2 进行一个项目 我需要对 AVI 文件的每一帧进行处理 但是当我运行代码时 它只获取文件的第一帧 CV CAP PROP POS FRAMES 似乎不起作用 有什么想法为什么不呢 CvCapture capt
  • 使用“.txt”文件中的值填充“JTable”

    我是java新手 我有一个像这样的文本文件 0784879541 P K Tharindu 745874654v Colombo 0714786542 H R Kamal 654124784v Colombo 0114784544 H P
  • 如何检测给定的 PIDL 是否实际上是 .zip 文件或类似文件?

    VS2010 引入了 CMFCShellTreeCtrl 它允许将文件夹浏览器树控件放入我们的 MFC 应用程序中 然而 这个类似乎严重缺乏过滤功能 即它将构建容器对象列表 IShellFolder 但似乎没有办法指定 zip 容器不应显示
  • 仅替换第一次出现的字符串?

    我有这样的事情 text This text is very very long replace words very word for word in replace words text text replace very not ve
  • 徽标而不是应用程序标题 闪亮

    我怎样才能在闪亮的应用程序中放置而不是标题 navbarPage title theme shinytheme flatly tabPanel Home 菜单选项卡大小中有一些标志吗 我尝试了这个解决方案 如何将图像插入到闪亮的 navba
  • ITextPdf:从右到左打印阿拉伯字符串(RTL)

    我在java上使用iTextpdf来生成带盖章的PDF 有时生成的PDF是阿拉伯语的 我面临一个有趣的问题 为了让阿拉伯语页面从右到左 RTL 创建 我使用具有以下属性的表格和单元格PdfPCell setRunDirection PdfW
  • 通过客户端脚本更改时访问服务器端只读文本框值的解决方法

    我在网格视图的每一行都有一个日期文本框 由于不允许用户在文本框中输入自己的值 因此我们将该属性设置为 ReadOnly true 并提供了一个日历java脚本插件来设置Textbox值 现在 当我尝试在保存单击时访问日期文本框时 文本框值不
  • j2me - 内存不足异常,它与最大堆或 jar 大小有什么关系吗?

    我目前正在开发一个用于接受订单的应用程序 在提出问题之前 让我向您介绍我的应用程序基本功能的一些详细信息 用户登录后 应用程序要做的第一件事就是从网络服务读取数据 产品 价格和客户 以便用户可以离线工作 一旦用户获得了所有必要的数据 他们就
  • 将连接的单词串分解为单个单词的快速方法

    假设我有这个字符串 hellohowareyou 有没有一种快速的方法将其分成单独的单词 所以最终结果是hello how are you 我可以想到几种方法 但它们会非常慢 首先我需要根据字典识别每个字母 看看哪些字母组成一个单词 并且可
  • 如果提交消息以给定字符串开头,则忽略 Jenkins 作业

    如果提交消息以给定字符串开头 我想忽略运行 Jenkins 作业 我尝试添加 其他行为 和 轮询忽略某些消息的提交 IE 如果提交消息以 doc 开头 我想忽略该作业 在我的世界中这意味着不运行该作业 我已经尝试了几个在线正则表达式匹配器
  • 如何将 SQL 与 PHP 分开?

    遵循鲍勃叔叔的建议干净的代码 我希望我的 PHP 代码中没有 SQL 目前 我正在使用准备好的语句 并将数据库访问代码分解到模型类中 我最初的想法是将 SQL 分解为单独的 SQL 文件 然后在运行时加载它们 由于这涉及更多的磁盘 IO 我
  • 如何在 ASP.NET Core 中启用 CORS

    我正在尝试在 ASP NET Core Web API 上启用跨源资源共享 但我陷入困境 The EnableCors属性接受policyName类型的string作为参数 Summary Creates a new instance of
  • next.js npm 模块注释给出错误

    这是我的错误 10 03 56 049 components navbar js 10 03 56 049 13 33 Warning img elements must have an alt prop either with meani
  • C++ 类何时在堆栈上实例化?

    我想澄清一下在堆栈上实例化类时会发生什么 当 C 类在堆上实例化时 MyClass myclass new MyClass 创建 MyClass 类型的指针 并通过 new MyClass 在同一行实例化该类 像这样拉伸它 MyClass