在C ++中,下面代码中的指针p和q之间有什么区别吗?
int* p = new int;
int* q = new int[5];
我知道第一个分配新内存给单个int,第二个分配内存给5个int的数组。但是,指向单个int和指向int数组的指针之间是否有任何根本区别呢?
我产生了这个疑问是因为我读到必须使用delete[]q
释放由q指向的内存,但仅使用delete p
释放由p指向的单个int。如果我使用delete q
会发生什么?
在C ++中,下面代码中的指针p和q之间有什么区别吗?
int* p = new int;
int* q = new int[5];
我知道第一个分配新内存给单个int,第二个分配内存给5个int的数组。但是,指向单个int和指向int数组的指针之间是否有任何根本区别呢?
我产生了这个疑问是因为我读到必须使用delete[]q
释放由q指向的内存,但仅使用delete p
释放由p指向的单个int。如果我使用delete q
会发生什么?
指针本身是完全无法区分的。这就是为什么您必须记得匹配new
/delete
和new[]
/delete[]
的原因。
不匹配它们会触发未定义行为。
使用 new []
时,一些 c++
实现会在返回指针之前的地址中跟踪数组分配的大小。这是一个未被标准定义的实现细节。
下面的答案更详细地描述了这种可能的实现:如何将 new[] 与 delete 配对可能导致仅内存泄漏?
您必须始终将 new
与 delete
以及 new []
与 delete []
匹配。混合使用它们是未定义行为。
delete
并不会对指针本身产生太大影响,而是针对它所指向的内容进行删除。删除一个int
不同于删除一个整数数组。 - 463035818_is_not_a_numberint
,但其中一个int
也恰好是数组的第一个元素。指向五个int
数组的指针的类型为int (*)[5]
。 - molbdnilo