两次调用析构函数

2023-11-22

对于以下代码:

#include<iostream>
#include<vector>
#include<string>
using namespace std;

 struct Test
 {

    string Str; 
    Test(const string s) :Str(s)
    { 
         cout<<Str<<" Test() "<<this<<endl;
    }
    ~Test()
    { 
         cout<<Str<<" ~Test() "<<this<<endl; 
    }
 };

 struct TestWrapper
 {
    vector<Test> vObj;
    TestWrapper(const string s)
    {
       cout<<"TestWrapper() "<<this<<endl;
       vObj.push_back(s);
    }

    ~TestWrapper() 
    { 
       cout<<"~TestWrapper() "<<this<<endl;
    }
 };

int main ()
{
   TestWrapper obj("ABC");
}

这是我在 MSVC++ 编译器上得到的输出:

测试包装器()0018F854
ABC 测试() 0018F634
ABC ~测试() 0018F634
〜测试包装器()0018F854
ABC ~测试() 003D8490

尽管只创建了一个 Test 对象,但为什么有两次对 Test 析构函数的调用。中间是否创建了任何临时对象?如果是,为什么没有调用其对应的构造函数?

我错过了什么吗?


您的输出不考虑测试的复制构造函数,它std::vector很容易使用。

您看到创建的测试对象是临时传递给push_back(),而不是实际中的那个vector.

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

两次调用析构函数 的相关文章

随机推荐

  • 不能写成 for 循环的 while 循环示例

    我知道 while 循环可以做 for 循环可以做的任何事情 但是 for 循环可以做 while 循环可以做的事情吗 请举个例子 是的 很容易 while cond S for cond S
  • 将新字段更新到现有文档

    是否可以将新字段更新到现有文档 例如 有一个包含多个字段的文档 例如 ID 99999 Field1 text Field2 text 该文档已经在索引中 现在我想在该文档中插入一个新字段 而不使用旧数据 ID 99999 Field3 t
  • 查找流星集合中的最新条目

    我的任务听起来很简单 但我无法确定如何编写这个 我只想找到插入集合中的最新项目并将其显示在我的流星应用程序上 我一直在使用 Collection find 但没有任何实际结果 这是我尝试过的最后一行 请记住这些名称是占位符 我的集合在我的代
  • 我如何在 make 目标之间传递 ENV 变量

    我在 makefile 中有这样的 target1 export var1 test MAKE target2 target2 echo var1 这是空的 我有其他依赖项 所以我想在第一个目标中设置变量 然后所有子依赖项应该能够访问该变量
  • 如何避免动态调度?

    我有以下特点 struct ArtistInfo some fields pub trait Fetcher fn fetch self artist String gt ArtistInfo 我想要有几个不同的获取器 可以在不同的情况下使
  • 从 ggplot 中删除 n 个图例

    我试图从下面的图中删除 n 图例 我猜这与stat部分geom bar 但我不完全确定它显示的内容 因此不知道如何删除它 我确实想要填充图例show legends FALSE不是正确的选择 抱歉 如果这是重复的 但之后 我找了很多找不到答
  • 为什么我收到“无法加载扩展。‘content_security_policy’值无效”?

    我正在尝试创建一个 chrome 扩展 我的清单文件是 name Alert Beep action manifest version 3 version 0 1 description Beeps if alert is called c
  • 带有 Fragments 和 FragmentActivity 的 TabHost

    我正在开发一个 Android 应用程序 我想使用 3 个选项卡进行导航 每个选项卡使用片段 但我不知道如何创建执行此操作的结构 我想单独添加每个片段 因为每个片段都不同 但我不知道在 FragmentActivity 中的哪里添加它们 我
  • 在 Android Studio (cmake) 中使用预构建的共享库

    我想在我的 Android 应用程序中使用 C 共享库 我试图遵循hello libs来自 Google NDK 样本的示例 但不知何故它不起作用 看来我的库没有打包到 APK 中 我发现的所有教程都在使用 mk 文件 但我想使用cmake
  • 我应该如何保护 iOS 中的 SQLite 数据库?

    我正在开发一个医疗保健 iOS 应用程序 我希望对用户的数据进行加密 这样如果他们的 iPhone 被盗 窃贼将无法访问他们的健康信息 合法所有者应该能够访问他们的信息 与这个问题 我正在考虑使用SQL密码加密整个数据库 并将SQLCiph
  • Netty客户端到服务器的消息

    这实际上是我在这里发表的第一篇文章 我已经尝试解决这个问题有一段时间了 但我终于调用了flag 并尝试在这个主题上获得一些帮助 所以我有一个客户端和一个服务器 它们是根据回显客户端 服务器和安全聊天客户端 服务器建模的 我对聊天的 SSL
  • Jackson 可以与 Spring MVC 3.0 一起使用来将 RequestBody 绑定到 Java Bean 吗?

    我有一个非常简单的问题 但我似乎找不到简单的答案 我让杰克逊开始连载爪哇豆 to JSON in the response using ResponseBody 但我没能序列化回来JSON to 爪哇豆 in the request usi
  • Azure API 管理 - 如何保护订阅密钥

    技术栈 API部署在WebApp中 部署 API 管理并将 WebApp 配置为 Web 服务 URL UI 在 Angular 应用程序中开发 该应用程序调用 API 管理端点以在 UI 上显示数据 实施 IP 身份验证以确保只有允许的用
  • 用于过滤列表的组件

    什么 Java Swing 组件适合创建如下所示的可过滤列表 这种类型的过滤最容易使用单列完成JTable 表具有内置功能来添加RowSorter which 提供排序的基础和过滤 也可以看看如何使用表格 排序和过滤 以下是过滤字体系列名称
  • Webusb:尝试在 Windows 上打开打印机时访问被拒绝

    我试图允许 POS Web 应用程序使用 Chrome webusb API 直接打印到 StarMicronics 或任何收据打印机 我正在使用这个例子here几乎完全一样 除了我修改了vendorId过滤到 StarMicronics
  • 将日期时间字符串转换为 R 中的 POSIXct 日期/时间格式

    考虑格式中的字符串 test lt YYYY MM DDT00 00 00 000 08 00 我的目标是将这些字符串转换为POSIXct格式 以便我可以绘制数据 我最初的想法是使用 as POSIXct test 但这似乎将日期时间截断为
  • 使用 JUnit 5 运行 Groovy 测试用例

    也许这很简单 但我在网上找不到任何示例 我想使用 JUnit 5 运行作为 Groovy 类实现的单元测试 我当前的设置似乎启动了 JUnit 5 但无法检测到测试用例 IntelliJ 识别测试 但无法运行它 如果我添加 Java 单元测
  • AttributeError:“模块”对象没有属性“分数”

    我在尝试使用该函数时遇到错误precision from nltk metrics scores 我尝试了许多不同的进口但没有成功 我查看了 python 目录中的文件 见下文 该函数就在那里 但只是 无法触及这个 那个 我在看 usr l
  • 如何指示 PowerShell 对 XmlSchemaSet 等 .NET 对象进行垃圾收集?

    我创建了一个 PowerShell 脚本 该脚本循环遍历大量 XML 架构 xsd 文件 并为每个文件创建一个 NETXmlSchemaSet对象 调用Add and Compile 向其中添加架构 并打印出所有验证错误 该脚本工作正常 但
  • 两次调用析构函数

    对于以下代码 include