C++字符串指针问题delete

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

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

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

 int main()
{
    char* pa = new char[10];
    char* pb = pa;
    //delete[] pa;
    delete[] pb;
    return 0;
}

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

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

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

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

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

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

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

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

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