qq_35640156
2016-08-11 14:20
采纳率: 66.7%
浏览 2.3k

C++字符串指针问题delete

指针pn声明是带[]的,创建了一个动态字符数组,而指针name声明是不带[]的,把pn赋值给name,那用delete释放new分配给pn的内存的时候,对name使用delete时到底带不带[]?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • GMFTBY 2016-08-14 09:43
    已采纳

    因为传送地址给name的时候,相当于是name指针和pn指针都指向了这段你动态开辟出来的内存地址,所以说,实际上name和pn是等价的,pn怎么用,name怎么用

    已采纳该答案
    打赏 评论
  • threenewbee 2016-08-11 15:27

    必须带方括号,否则会只释放第一个元素造成内存泄漏!

    打赏 评论
  • theForger 2016-08-13 01:39
     int main()
    {
        char* pa = new char[10];
        char* pb = pa;
        //delete[] pa;
        delete[] pb;
        return 0;
    }
    

    这样是不对的,没有删除分配的内存,你要删除pa,

    打赏 评论
  • John_ToDebug 2016-08-14 03:13

    因为你所开辟的字符数组的空间是连续的,你应该发现一个问题,你释放一个链表(每个节点地址物理上不连续)是不是只能一个节点一个节点去释放,这样
    才能保证链表内存释放正确。如果说是你用delete []是不行的,记住delete[] 永远只适合元素内存地址连续的数据结构。。。

    打赏 评论
  • 做技术死路一条 2016-08-17 14:59

    char * pn=new char[10];
    char * name=new char;
    name =pn;

    这里pn和name是指向同一块内存,delete name不对,该用delete [] name; 或者delete [] pn; 这2个是等价的。
    不过在赋值操作后 name 之前指向的内存没有释放。

    打赏 评论
  • hijack00 2016-08-22 12:59

    pn和name的内涵是不一样的。pn指向一个动态字符数组。如果把pn赋值给name,那么name只是指向pn字符数组的第一个元素。实际上还是引用的pn所指向的那块内存。所以应该用pn来释放这块内存,使用delete []。不要使用name来释放内存,这样只能释放第一个元素,造成内存泄漏

    打赏 评论
  • xiaohuh421 2016-09-02 02:24

    官方说的是, 申请的时候有[] , 释放的时候就要有[]
    但实际上, 基本数据类型, 在释放的时候是可以不要[]的.
    加[]的目的告诉编译器, 释放的是多个元素, 并且可能要调用析构函数.

    你想一想,
    CPoint *pPos...............

    delete pPos 它是什么呢? 是释放多个CPoint对象, 还是一个呢? 这时肯定就只能加[]来区别一个与多个了.

    而基本数据类型为什么不需要呢?
    因为对象的释放是需要调用析构函数的, 不能仅仅把内存释放了,
    而基本数据类型不需析构什么的, 就可以直接释放内存就完了. 所以加[]与不加, 可以不有区别, 都是释放内存.

    打赏 评论

相关推荐 更多相似问题