![]() |
1
154
这是否会导致内存泄漏、擦除硬盘、让你怀孕、让讨厌的鼻魔在你的公寓里追你,或者让一切正常工作而没有明显的问题,这些都是未知的。一个编译器可能是这样,另一个编译器可能会改变,新的编译器版本可能会改变,每次新的编译,月亮的相位,你的心情,或者取决于最后一个阳光明媚的下午通过处理器的中微子的数量。也可能不是。 所有这些,以及无数其他可能性都被放在一个术语中: 未定义的行为 :
|
![]() |
2
14
这只是某些操作系统和编译器上一些“未定义”行为的示例。希望它能对人们调试代码有所帮助。 测试1
测试2
测试3
测试1
测试2
测试3
测试1
测试2
测试4
测试1
测试3
测试4
|
![]() |
3
7
它通常不会泄漏,因为在POD的情况下,析构函数是微不足道的,所以不需要调用它们
但不要依赖于此,因为这是未定义的行为。也许它工作正常,也许发生了一些可怕的事情,在这个编译器上工作,在另一个编译器上不工作,很多人感谢你植入了一个错误。 this answer 详情请参阅。 |
|
4
5
删除 : 仅用于元素的析构函数 指向(如果需要), 删除[] 每个元素的析构函数 在其阵列中(如果需要), 然后释放内存块 |
![]() |
5
5
未定义 并且会因编译器而异。例如,MSVC编译器将生成与GCC不同的代码。 如果A指向通过新T[n]分配的数组,则必须通过delete[]A将其删除。delete和delete[]之间的区别很简单——前者破坏标量对象,后者破坏数组。 |
![]() |
6
-4
对于数组 豆荚 会的 不漏 (拥有最多的编译器)。例如 产生 完全相同的 删除 和 删除[] 豆荚 . 就我个人而言,我认为C/C++可以不使用操作符delete[]。编译器知道对象大小,分配的内存大小在运行时是已知的,因此很容易知道是否是指针数组,并以正确的方式处理内存。
好的,伙计们。你能在你的编译器上测试一下它是否泄漏吗? , 新[] , 删除 删除[] . 每个 删除 . 看起来完美而完整。让我们看看你打电话时发生了什么 删除[] ?
析构函数的作用是什么 豆荚 ? 没有什么! 那么,打电话 删除 豆荚 不会泄漏!即使它违反了标准。即使不推荐。 编辑2:
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 4 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 5 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 5 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 5 月前 |