堆栈对象的“删除”行为是什么? [复制]

2024-01-15

int main()
{
    Class_Name t;
    Class_Name * p = &t;

    delete p;
    return 0;
}  

这段代码在调用 2 个析构函数时执行得很好?删除如何处理堆栈对象?行为是否未定义?


你遇到了未定义的行为。

标准(N3690)5.3.5[expr.delete]/2

如果操作数具有类类型,则操作数将转换为指针 通过调用上述转换函数来类型化,并且 转换后的操作数用于代替原始操作数 本节的其余部分。在第一个替代方案(删除对象)中, delete 操作数的值可以是空指针值,a 指向由先前的 new 表达式创建的非数组对象的指针,或者 指向代表此类基类的子对象 (1.8) 的指针 对象(第 10 条)。如果不是,则行为未定义。
...

您没有空指针,也没有先前用 new 分配的对象,因此行为未定义。

Note:即使在尝试做的时候

int main()
{
    Class_Name t;
    t.~Class_Name()
    return 0;
}

这将是未定义的行为。即使它没有删除,只是因为它显式调用具有自动存储持续时间的对象的析构函数。这意味着析构函数将被调用两次,一次是在显式调用它时,第二次是在离开它的作用域时。

标准12.4[class.dtor]/15

一旦为对象调用析构函数,该对象就不再 存在;如果为某个对象调用析构函数,则行为未定义 生命周期已结束的对象 (3.8)。 [示例:如果析构函数 对于自动对象被显式调用,并且该块是 随后以通常会调用隐式的方式离开 对象被破坏时,行为是未定义的。 —结束示例 ]

大多数时候,尝试做类似的事情(希望)会导致崩溃。对于一个微不足道的解构函数,你可能会运气不好,但什么也不会发生。

这里有一些术语挑剔:C++ 标准不讨论堆栈和堆对象,它总是分别讨论自动存储持续时间和动态存储持续时间。正如您在上面的引用中也可以看到的那样。


您应该始终遵循一般准则:

  • 对于堆栈分配的对象,不要执行任何显式释放/删除(析构函数会自动调用)。
  • 对于每个new应该有一个对应的delete
  • 对于每个new[]应该有一个对应的delete[]
  • 对于每个malloc or calloc应该有一个对应的free
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆栈对象的“删除”行为是什么? [复制] 的相关文章

随机推荐

  • 如何使用 Json.NET 将 IHtmlString 序列化为 JSON?

    我有一个包含通过 JSON 发布的原始 HTML 的字段 该字段最近从字符串转换为 IHtmlString 当这个变化发生时 该字段从一个 JSON 字符串变成一个空对象 并且一堆消耗 JSON 的东西开始爆炸 When it was a
  • 使用curl 时,出于安全原因,如何使我的cacert.pem 保持最新状态?

    我想保持我的根证书为最新状态 以便与 cURL 和 PHP 内部一起使用curl命令 但是当前没有参数可以下载正确的安全连接所需的当前文件并使其保持最新 以及使用示例curl在 PHP 中用于安全连接 需要一个名为cacert pem 用于
  • Option.zip 返回列表,而不是选项

    标准库文档描述zip部分签名为def zip B that GenIterable B Option A B but Some 1 zip Some 2 返回一个List 1 2 not Some 1 2 是实施有问题还是文档有问题 有缺陷
  • 如何使用 C# 将每个单词的第一个字符或整个字符串的第一个字符大写?

    我可以编写自己的算法来做到这一点 但我觉得应该有相当于ruby 的人性化 http api rubyonrails org classes ActiveSupport CoreExtensions String Inflections ht
  • 如何在 Ruby 2.7.0 上安装 Nokogiri

    我最近升级到 Ruby v2 7 0 当我尝试安装 Nokogiri 时 出现以下错误 ERROR Error installing nokogiri The last version of nokogiri gt 0 to support
  • 根据另一列中的值有条件地使用颜色填充特定列中的单元格

    我有以下数据框 col1 lt rep c A B C D 10 col2 lt rep c 1 0 10 col3 lt rep c 0 1 10 col4 lt rep c 1 0 10 col5 lt rep c 0 1 10 tes
  • Git“实时服务器”最佳实践

    我和我的合作伙伴一直在尝试从影响公众可查看的文件的存储库中推送和拉取的想法 而不是将存储库存储在隐藏位置 并在我们认为文件可以使用时仅通过 FTP 传输文件 虽然能够直接推送到 实时站点 将非常方便 但我想知道这会产生什么负面影响 如果有的
  • 在浏览器中编译一个“.vue”组件,只用JS?

    我想将 vue 组件 包含 html js css 编译为 JS 但在浏览器端 没有 browserify vuify webpack 或其他 在一个更好的世界中 我想将我的 vue 组件包含到我的 html 应用程序中 就像这样 不需要在
  • Google 表格中的 SUBQUERY 等效项

    使用查询 我尝试计算当月注册的托盘最多的当天注册的托盘的最大数量 该栏将启动 最大日 我的电子表格的链接 https docs google com spreadsheets d 1DkLmJUUFJgnlMD2u PYcxmPlal ar
  • 熊猫压平一列中的列表列表?

    我正在尝试压平一列 该列是列表的列表 var var2 0 9122532 0 458182615 0 79834910 0 1 79834910 0 458182615 0 9122532 0 2 458182615 0 79834910
  • 尝试播放声音时出错

    类似这个问题Matlab 中的基本声音错误 https stackoverflow com q 9369833 501663 没有答案 当我尝试播放声音 Matlab 2012a Windows 7 64位 时 使用sound sounds
  • java中的继承和超类(Object, Class)

    Is java lang Object隐式继承的所有自定义类 对象的超类 我以为java不支持多重继承 我问的原因是我是否已经从自定义类中的另一个类继承 并且 java 再次强制隐式继承java lang Object最重要的是 这不是多重
  • 为什么我们要在FRP中使用Behavior

    我正在学习反应式香蕉 为了理解该库 我决定实现一个虚拟应用程序 每当有人按下按钮时 该应用程序就会增加计数器 我使用的 UI 库是 Gtk 但这与解释无关 这是我提出的非常简单的实现 import Graphics UI Gtk impor
  • 是否可以有像部分类一样的部分xaml?

    我想将一个 xaml 文件分成几个文件 有点像部分类 有办法做到这一点吗 我希望能够更方便地管理我的项目文件 有一些可能性 尽管它可能并不完全是你所想的 您可以通过 ResourceDictionary 的方式外包资源 这对于样式和模板来说
  • 是否可以更改导航按钮以显示图像而不是蓝色?

    我正在尝试设置一个NavigationButton显示图像 而不仅仅是蓝色按钮 目前 我正在显示一个水平的 Scrollview 由图像组成 这些图像应该导致另一个视图 该视图将呈现在rootView 然而 当我将这些图像包裹在Naviga
  • 在带有 iOS 11 的 xcode 9 中 - 首次运行时加载地图图块的问题

    更新了新发现 在模拟器和设备上进行了测试 当应用程序从冷启动运行时 地图无法正确加载 不显示图块 mapViewDidFinishLoadingMap没有被调用 因此 由于地图未完成而出现问题 但我没有收到任何错误 如果我只是短暂退出应用程
  • 如何使用模拟框架测试在谷歌测试延迟后进行的调用

    我目前正在尝试评估不同的测试框架 当使用模拟框架时 我倾向于 FakeIt 但 google mock 也很好 我知道您可以通过在调用函数之前和之后使用操作系统的计时器调用来验证函数的性能来进行自己的 性能 测试 这不是我所追求的 我所做的
  • C# 如果一个方法花费的时间超过 2 秒,如何停止它?

    下面的程序将连接到网络并获取 msnbc com 网页的html内容并打印结果 如果从网页获取数据的时间超过 2 秒 我希望我的方法停止工作并返回 您能举个例子告诉我如何做到这一点吗 public partial class Form1 F
  • 如何使用条件空运算符来检查空字符串?

    我正在尝试执行 LINQ to 对象查询 如下所示 var c1 allCustomers Where x gt x CompanyName Replace StartsWith searchText ToList 只要 CompanyNa
  • 堆栈对象的“删除”行为是什么? [复制]

    这个问题在这里已经有答案了 int main Class Name t Class Name p t delete p return 0 这段代码在调用 2 个析构函数时执行得很好 删除如何处理堆栈对象 行为是否未定义 你遇到了未定义的行为