c – 是否期望删除[]的这种行为 – 只删除前两个元素?
发布时间:2020-12-16 09:51:59 所属栏目:百科 来源:网络整理
导读:我的代码: #includeiostream#includecstdlibusing namespace std;int main(){ int * p; p = new int[5]; p[0] = 34; p[1] = 35; p[2] = 36; p[3] = 44; p[4] = 32; cout "Before deletion: " endl; for (int i = 0; i 5; i++) { cout p[i] endl; } delete[]
我的代码:
#include<iostream> #include<cstdlib> using namespace std; int main() { int * p; p = new int[5]; p[0] = 34; p[1] = 35; p[2] = 36; p[3] = 44; p[4] = 32; cout << "Before deletion: " << endl; for (int i = 0; i < 5; i++) { cout << p[i] << endl; } delete[] p; cout << "After deletion: " << endl; for (int i = 0; i < 5; i++) { cout << p[i] << endl; } } 如果删除[]应该删除由new创建的所有内存块,那么为什么只有前两个元素被删除? 这是输出: Before deletion: 34 35 36 44 32 After deletion: 0 0 36 44 32 我能想到的一个可能的原因是它删除了前两个,其中一些如何使内存管理认为整个块可以在需要时再次重新分配.虽然这是我的完全猜测,但我不知道真正的原因. 解决方法
删除的不是前两个项目,而是全部删除.现在可以通过进一步的新操作重用该存储区域,但不能保证该存储区域中剩余的内容.
您可能会看到不同机器,后续在同一台机器上运行,不同编译器版本等的不同结果.只是不要依赖它. 但是,您正在访问一个悬空指针,这是未定义的行为(简称UB). 以防万一,如果你在没有方括号的情况下调用delete,则所有内存都将被解除分配,但可能不会调用析构函数.即使你在这种情况下没有自定义类型,也就是整数,这也是UB. 在您的情况下,它与删除和删除[]分别是完全相同的UB行为.这就是为什么你在当前的运行中看到两种情况下相同的结果,但是再次,即使这不能保证. 理想情况下,您还需要将它们设置为零,但实际上,您应该考虑使用智能指针,如unique_ptr. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |