加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读