通过引用传递 - 为什么调用这个析构函数?

2024-04-07

我找不到(在关于析构函数调用主题的许多问题中)任何与我的情况完全相同的问题。

当传递的参数是引用时,为什么会调用析构函数?我将注释(主要在 main 中)放在我认为执行输出的代码行下。

struct X { // simple test class
   int val;

   void out(const std::string& s, int nv)
   {
      std::cerr << this << "–>" << s << ": " << val << " (" << nv << ")\n";
   }

   // default constructor
   X() { 
      out("X()", 0); 
      val = 0; 
   } 

   X(int v) { 
      val = v; 
      out("X(int)", v); 
   }

   // copy constructor
   X(const X& x) {
      val = x.val; 
      out("X(X&) ", x.val); 
   } 

   // copy assignment
   X& operator=(const X& a)
   {
      out("X::operator=()", a.val); 
      val = a.val; 
      return *this;
   }

   // Destructor
   ~X() { 
      out("~X()", 0); 
   }
};

X glob(2); // a global variable
// Output Line 1: X(int): 2 (2)

X copy(X a) { 
   return a; 
}

main功能:

    int main()
{
   X loc{ 4 }; // local variable
      // Output Line 2: X(int): 4 (4)
      // ^from X(int v) function
   X loc2{ loc }; // copy construction
      // Output Line 3: X(X&) : 4 (4)
      // ^from X(const X& x) function
   loc = X{ 5 }; // copy assignment 
      // Output Line 4: X(int): 5 (5)
      // ^from X(int v) function
      // Output Line 5: X::operator=(): 4 (5)
      // ^from the '=' operator overload
      // Output Line 6: ~X(): 5 (0) - ???
   loc2 = copy(loc); // call by value and return 
      // Or does Output Line 6 result from here?
   .
   .
   .
}

1)这个析构函数被调用是因为loc = X{ 5 }; // copy assignment或之后的行:loc2 = copy(loc); // call by value and return?

2)为什么会这样称呼?根据我的阅读,析构函数仅在以下情况下被调用:

a) names go out of scope
b) program terminates
c) "delete" is used on a pointer to an object

我知道它不是“b”或“c”,所以它一定是因为某些东西超出了范围。但我不认为超出复制赋值函数范围的引用会执行此操作。


您可以看到在复制赋值发生后不久就调用了析构函数。副本分配完成后,临时 (x{5})被破坏。

来自标准关于析构函数的部分:

15.4 析构函数
...
12. 隐式调用析构函数
(12.1) — 对于在程序终止时具有静态存储持续时间的构造对象,
(12.2) — 对于在线程退出时具有线程存储持续时间的构造对象,
(12.3) — 对于构造对象,当创建对象的块存在时,其具有自动存储持续时间,
(12.4) — 对于构造的临时对象,当其生命周期结束时。

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

通过引用传递 - 为什么调用这个析构函数? 的相关文章

随机推荐

  • 无法打开意图android的pdf文件

    我彻底检查了pdf文件是 在 storage emulated 0 Download Abcd pdf 但无法有意打开它 我在各种视图中打开它 其中一些会导致错误 无法打开文件 微软的话说道 check file in the device
  • 在tkinter中生成点击事件

    我正在尝试对我的 tkinter GUI 进行单元测试 因此我尝试从单独的线程生成点击事件 下面是测试 Tkinter Button 的示例 import unittest threading from Tkinter import cla
  • 我的枚举可以有友好的名称吗? [复制]

    这个问题在这里已经有答案了 我有以下内容enum public enum myEnum ThisNameWorks This Name doesn t work Neither does this 是不是不可能有enum带有 友好名称 你可
  • PHP如何获取基域/url?

    function url if isset SERVER HTTPS protocol SERVER HTTPS SERVER HTTPS off https http else protocol http return protocol
  • 删除文本文件 php 中的一行[重复]

    这个问题在这里已经有答案了 所以我的想法是使用正则表达式在文本文件中查找特定行 然后用空白替换该行 实质上将其删除 但是 我正在努力在文本文件中重写带有空白的行 elseif inquiry delete file fopen databa
  • 使用 getopt 时“for i”没有“in [sequence]”结尾

    我找到了在 shell 中使用 getopt 命令的示例脚本 bin bash args getopt ab set args for i do case i in a shift echo it was a b shift echo it
  • RNC 中交织

    我有三个具有不同属性值的 p 的源代码 我尝试对元素进行任意顺序以及一个强制元素 p class paragraph1 即任意数量的第 1 段 第 2 段和第 3 段 按任意顺序 但必须至少有一个段落 1 下面我尝试了 RNC 中的交错选项
  • PDF Tm 运算符

    我试图突出显示 PDF 文档中的文本 但我发现了一个带有以下操作数的 Tm 运算符 0 7 98 7 98 0 90 8898 715 4183 Tm Tm 运算符应该仅在其操作数上替换文本矩阵和文本行矩阵 根据Pdf Reference
  • 如何使用.NET设置文件夹权限?

    是否可以使用小型 NET 页面来设置其所在服务器上某些文件夹的文件夹权限 可用于此目的的代码或对象是什么 我使用的是 Windows Server 2003 基本上我想使用 GET 或 POST 访问页面并运行它并检查和 或更新文件夹的权限
  • Delphi Datasnap ISAPI 模块上的 CORS 问题

    我们在 AngularJS 客户端访问 Datasnap REST Delphi 10 1 Berlin 服务器时遇到问题 我无法激活授权 因为 Angular 无法在 Pragma 标头中发送 dssession 这似乎是 CORS 的问
  • 如何处理时间耦合?

    我正因为这个而挣扎 我的类有一些具有时间耦合的方法 这是一些方法MethodA必须首先调用来 初始化 数据MethodB需要正常工作 我通常通过将有问题的依赖传递给 方法B 作为论据 就像这个片段中一样 private class Some
  • vue组件名必须小写?

    我正在尝试在我的视图文件中使用一个组件 以下不起作用 当我尝试在我的视图中安装组件时
  • 根据列表从表中选择行

    我有这张表 col1 lt c 1 2 3 4 5 col1 lt sample col1 1000 replace TRUE prob c 0 2 0 2 0 2 0 2 0 2 col2 lt c 6 7 8 col2 lt sampl
  • 使用 StreamWriter 将行附加到文件

    我想将行附加到我的文件中 我正在使用 StreamWriter StreamWriter file2 new StreamWriter c file txt file2 WriteLine someString file2 Close 我的
  • cscope 或 ctags 为什么选择其中之一? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我主要使用 vim gvim 作为编辑器 并且正在考虑结合使用lxr Linux 交叉参考 http
  • 使用 CMake 添加仅标头依赖项

    我有一个简单的项目 需要三个仅头文件库才能编译 网络套接字 https github com zaphoyd websocketpp spdlog https github com gabime spdlog and 恩洛曼 json ht
  • Visual Studio 2015 IIS Express 500 错误

    我有一个 ASP Net 网站项目 我正在将其迁移到 Net 4 6 1 我已经安装了 Visual Studio 2015 Community 并且已成功编译并构建了网站及其组件 DLL 当我尝试使用 IIS Express 通过 F5
  • 如何使用循环将字符串连接成一个?

    有人可以帮我解决字符串连接问题吗 我从寄存器读取数据 它的函数 utf regAddr length 我得到带有十进制数字的表格 然后将其转换为十六进制并循环字符串 我需要将这些字符串连接成一个 Lua中没有像 这样的操作符 functio
  • 在 Lisp 解释过程中,“读者”的任务是什么?

    我想知道 读者 在解释 编译 Lisp 程序期间的目的 或者更准确地说 是 读者 的任务 从我刚刚完成的问题前研究来看 在我看来 读者 特别是本例中的 Clojure 可以被视为 语法预处理器 它的主要职责是读取器宏和原始形式的扩展 所以
  • 通过引用传递 - 为什么调用这个析构函数?

    我找不到 在关于析构函数调用主题的许多问题中 任何与我的情况完全相同的问题 当传递的参数是引用时 为什么会调用析构函数 我将注释 主要在 main 中 放在我认为执行输出的代码行下 struct X simple test class in