【问题标题】:What does deleting a pointer mean?删除指针是什么意思?
【发布时间】:2011-01-27 19:24:36
【问题描述】:

删除指针和释放指针(分配内存)一样吗?

【问题讨论】:

    标签: c++ pointers memory-management


    【解决方案1】:

    删除一个指针(或者删除它指向的东西,或者)意味着

    delete p;
    delete[] p; // for arrays
    

    p 是在该语句之前分配的,例如

    p = new type;
    

    也可能指使用其他的动态内存管理方式,如free

    free(p);
    

    之前使用malloccalloc分配的

    p = malloc(size);
    

    后者更常被称为“释放”,而前者更常被称为“删除”。 delete 用于带有析构函数的类,因为delete 除了释放内存之外还会调用析构函数。 free(和malloccalloc等)用于基本类型,但在C++中newdelete同样可以用于它们,所以没有太多理由在C++,兼容性原因除外。

    【讨论】:

    • 所以这一切又回到了 new/delete 和 free/malloc 在内存管理上的区别?
    • 指向 NULL 的指针和“已删除”的指针相同还是不同?
    • @ashish,是的。 malloc 和 free 只关心内存,而不关心内存的类型。 new 关心类型并在必要时调用构造函数,还可以扩展它以从与默认不同的内存池中获取内存(分别通过编写自己的operator newoperator delete)。
    • @ashish,将指针的值更改为 null 与删除它不同。如果仅将其设置为 null,则该指针之后将不指向任何对象,但它之前指向的对象的内存不会被释放。所以实际上你会通过这样做泄漏内存。首先删除/释放,然后设置为空(不要让已删除的指针保留其旧值 - 这将使您稍后无法测试指针是否指向已分配的内存。这很糟糕)。
    • @litb 那么如果我尝试删除指向 null 的指针会发生什么?
    【解决方案2】:

    你不能“删除”一个指针变量

    当然可以;-)

    int** p = new int*(new int(42));
    delete *p;
    delete p; // <--- deletes a pointer
    

    但是说真的,delete 真的应该叫delete_what_the_following_pointer_points_to

    【讨论】:

    • @piyukr 不,delete 在释放内存之前调用析构函数。 free 只是释放内存。在从 new 获得的指针上调用 free 会导致未定义的行为。
    【解决方案3】:

    是的,delete 用于释放内存并调用相关对象的析构函数。

    通常的做法是在删除NULL 后设置指针以避免周围出现无效指针:

    Object *o = new Object();
    
    // use object
    delete o; // call o->~Object(), then releases memory
    o = NULL;
    

    newdelete 在 C++ 源代码中与标准 C 类型一起使用时,它们的行为类似于 mallocfree

    【讨论】:

    • +1,但从技术上讲,编译器会调用析构函数,然后按顺序释放内存。
    • 是的,我没有指定顺序..我的错误,实际上调用已释放对象的析构函数没有多大意义..
    • 订单来自你delete o后的评论; (应该颠倒过来)。
    【解决方案4】:

    您不能“删除”指针变量,只能将其值设置为 NULL(或 0)。

    【讨论】:

    • +1。这是正确的答案——如果 Ashish 是指 C 指针,例如在定义“char *cpString”时。在 C 中,我们从不释放指针,而是释放分配的内存。
    【解决方案5】:

    是的,删除指针与释放内存或释放内存等相同。

    【讨论】:

      【解决方案6】:

      是的,它调用了适当的析构函数。

      【讨论】:

      • 嗯,不,它不是,因为它调用析构函数,而 free 没有!
      • 此外,不能保证“删除”和“免费”在同一个堆上工作。如果你用“new”分配一些东西,然后对它做一个“free”,你可能会破坏你的堆和/或让你的程序崩溃。 “malloc”/“delete”组合也是如此。
      • 啊,我的错,我在考虑“免费”的更一般的、非关键字的意义
      【解决方案7】:

      简而言之,是的。

      但是你必须小心:如果你使用p = new sometype() 分配,那么你应该使用delete p。如果您使用p = sometype[count] 分配,请始终使用delete [] p

      还有一件事:你永远不应该配对 malloc/deletenew/free

      【讨论】:

        猜你喜欢
        • 2012-11-02
        • 1970-01-01
        • 2021-04-21
        • 2014-06-25
        • 2011-02-04
        • 2023-03-03
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多