什么时候调用 C++ 析构函数?

2023-11-21

基本问题:程序何时调用 C++ 中类的析构函数方法?有人告诉我,只要一个对象超出范围或受到某个对象的影响,就会调用它delete

更具体的问题:

1)如果该对象是通过指针创建的,并且该指针后来被删除或被赋予一个新的地址来指向,那么它所指向的对象是否会调用其析构函数(假设没有其他东西指向它)?

2) 继续问题 1,什么定义了对象何时超出范围(不涉及对象何时离开给定的 {block})。那么,换句话说,什么时候对链表中的对象调用析构函数?

3)您是否想手动调用析构函数?


1)如果该对象是通过指针创建的,并且该指针后来被删除或被赋予一个新的地址来指向,那么它所指向的对象是否会调用其析构函数(假设没有其他东西指向它)?

这取决于指针的类型。例如,智能指针在删除对象时常常会删除它们。普通指针则不然。当指针指向不同的对象时也是如此。一些智能指针会销毁旧对象,或者如果它没有更多引用,则会销毁它。普通指针没有这样的智能。它们只是保存一个地址,并允许您通过专门这样做来对它们指向的对象执行操作。

2) 继续问题 1,什么定义了对象何时超出范围(不涉及对象何时离开给定的 {block})。那么,换句话说,什么时候对链表中的对象调用析构函数?

这取决于链表的实现。典型的集合在被销毁时会销毁所有包含的对象。

因此,指针的链表通常会破坏指针,但不会破坏它们指向的对象。 (这可能是正确的。它们可能被其他指针引用。)但是,专门设计用于包含指针的链表可能会在其自身销毁时删除对象。

当指针被删除时,智能指针的链接列表可以自动删除对象,或者如果它们不再有引用,则可以自动删除对象。这一切都取决于你来选择那些能完成你想要的事情的部分。

3)您是否想手动调用析构函数?

当然。一个例子是,如果您想用另一个相同类型的对象替换一个对象,但不想释放内存只是为了再次分配它。您可以就地销毁旧对象并就地构建一个新对象。 (但是,通常这是一个坏主意。)

// pointer is destroyed because it goes out of scope,
// but not the object it pointed to. memory leak
if (1) {
 Foo *myfoo = new Foo("foo");
}


// pointer is destroyed because it goes out of scope,
// object it points to is deleted. no memory leak
if(1) {
 Foo *myfoo = new Foo("foo");
 delete myfoo;
}

// no memory leak, object goes out of scope
if(1) {
 Foo myfoo("foo");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候调用 C++ 析构函数? 的相关文章

  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 使用sbt编译Java注解

    我已经在下面创建了 Java 注释 因为我需要运行时保留 PROJECT src main java我的 scala 代码使用了这些 java 注释 PROJECT src main scala 这样创建的 Java 注释也使用 Java
  • ListView 布局与 RTL 语言(阿拉伯语)渲染不一致

    我有简单的 ListView 和 ArrayAdapter 正在工作正好 问题始于RTL语言 在本例中为阿拉伯语 当你第一次打开它时 一切看起来都很好 但向下滚动并向后滚动后 某些项目似乎渲染不正确 代码很简单 请注意 如果我不重复使用视图
  • 缓存 URL 图像 iphone UITableview

    我正在寻找有关如何将从 url 加载的图像缓存到 uitableview 单元格中的教程 我在这里找到了一个例子 http www ericd net 2009 05 iphone caching images in memory html
  • 如何从 JavaScript 中的 URL 中提取 GET 参数? [复制]

    这个问题在这里已经有答案了 可能的重复 在javascript中使用url的get参数 假设我有这个网址 s http mydomain com q microsoft p next 在这种情况下 如何从字符串中提取 microsoft 我
  • SendGrid 与单个电子邮件的唯一参数

    我尝试为每封电子邮件设置一个唯一参数列表 SMTP api 的官方参考非常简单地描述了此功能 here 我正在使用的 SendGrid PHP 库的 API 文档也没有多大帮助 setUniqueArguments Set a list o
  • 尝试在 pgAdmin4 中备份数据库时出现“[Errno 2] 无此类文件或目录”

    我终于设法在首选项中手动设置 PostgreSQL 二进制路径 为什么用户必须在 pgAdmin3 中不需要时执行此操作 老实说 我不知道第二个路径字段 EDB Advanced Server Binary Path 的含义是什么 但我没有
  • HAProxy - 后端服务器的基本身份验证

    我使用以下配置从本地 127 0 0 1 2000 代理访问互联网 global log 127 0 0 1 local0 log 127 0 0 1 local1 notice log loghost local0 info maxcon
  • 修复重大升级问题

    以下是场景 1 安装 1 0 1 1 然后升级到 1 0 2 2 gt 这很好用 如预期 2 安装 1 0 2 2 然后降级到 1 0 1 1 gt 这不起作用 如预期 3 安装 1 0 1 1 然后安装 1 0 1 1 gt 这将进入修复
  • Python 字典 vs C++ std:unordered_map (cython) vs cythonized python dict

    我试图测量 python 字典 cythonized python 字典和 cythonized cpp std unordered map 之间的性能 仅执行 init 过程 如果编译 cythonized cpp 代码 我认为它应该比纯
  • .NET 中是否有与进程外 COM EXE 等效的东西?

    COM ActiveX 的优点之一是进程外 EXE 您可以有一个 EXE 它以可供其他进程 包括 VBScript 和 JScript 使用的形式公开方法和属性 同时 EXE 可以拥有自己的功能 与其类型库公开的功能相关或无关 NET 的等
  • 合作多重继承问题

    这是一个扩展这个问题并提出了一个问题 希望您 我的 StackOverflowers 同胞能够帮助我解决这个问题 从引用的问题中 考虑最终的代码示例 class A object def init self print entering A
  • 将任意 R 对象存储到 HDD 上?

    据我所知 我们可以将数据矩阵导出到csv or xlsx files 对于像这样的复杂对象呢 lm 例如 在我的工作中 我可能有一个长度为 1000 的列表 每个列表都有一个lm 目的 每次我加载R我必须等待很长时间才能用这些填充 1000
  • 错误:(-2:未指定错误)该功能未实现。使用 Windows、GTK+ 2.x 或 Cocoa 支持重建库

    我正在 jupyter 笔记本上从事手语检测项目 在运行活体检测代码时 我遇到了如下错误 OpenCV 4 5 1 C Users appveyor AppData Local Temp 1 pip req build 1drr4hl0 o
  • 加载数据时pig出错

    我使用的是 ubuntu 12 02 32bit 并已安装hadoop2 2 0 and pig 0 12成功地 Hadoop 在我的系统上运行正常 但是 每当我运行此命令时 data load atoz csv using PigStor
  • 将应用程序配置为 Facebook 错误:“应用程序的 Facebook 登录配置错误..”[重复]

    这个问题在这里已经有答案了 可能的重复 应用程序的 Facebook 登录配置错误 Android Facebook 集成问题 我正在尝试将 facebook 集成到我的应用程序中 当我按下登录按钮并填写电子邮件和密码时 我在应用程序中收到
  • Angular Material 7 拖放 x 和 y 坐标

    我有一个容器 里面有一个元素 我希望能够将元素拖动到容器内的另一个位置并查看新的 x 和 y 坐标 其中 x 0 和 y 0 是容器的左上角 我在以下位置设置了一个基本的 stackblitzhttps stackblitz com edi
  • 为什么我的数字四舍五入不正确?

    这感觉像是那种只会在原地失败的代码 但我会尝试将其改编成代表我所看到内容的代码片段 float f myFloat myConstInt Where myFloat 13 45 and myConstInt 20 int i int f i
  • 执行 pipfile 脚本

    如何执行 Pipfile 中定义的脚本 按照语法发现here 我在 pipfile 中定义了脚本部分 如下所示 scripts tests bash run tests sh 运行后 pipenv install 我怎样才能调用tests
  • 安装apk时出现java.lang.SecurityException

    如你所知 apk 是一个 zip 存档 我提取了它并替换了一些资源 然后再次压缩它 当我安装它时 我收到此异常 java lang SecurityException META INF MANIFEST MF 具有无效摘要 这个错误有什么解
  • 什么时候调用 C++ 析构函数?

    基本问题 程序何时调用 C 中类的析构函数方法 有人告诉我 只要一个对象超出范围或受到某个对象的影响 就会调用它delete 更具体的问题 1 如果该对象是通过指针创建的 并且该指针后来被删除或被赋予一个新的地址来指向 那么它所指向的对象是