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

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(使用前将#替换为@)

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

  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • 弱变量中间为零

    弱变量什么时候变为零 weak var backgroundNode SKSpriteNode texture SKTexture image initialBackgroundImage backgroundNode position C
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是

随机推荐

  • 如何使用 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 个析构函数时执行得很好 删除如何处理堆栈对象 行为是否未定义 你遇到了未定义的行为