在不使用方括号的情况下删除C++数组内存仍然有效吗?

6 浏览
0 Comments

在不使用方括号的情况下删除C++数组内存仍然有效吗?

这个问题已经有答案了:

delete和delete[]有什么区别?

如何正确地删除数组指针?

如何在C++中使用数组?

动态分配的字符串数组无法释放

int* arr = new int[count];
delete arr;

这为什么有效?我已经检查过了,它确实释放了内存。根据我所看到的,我需要使用delete[] arr;否则它不会释放所有内存。

admin 更改状态以发布 2023年5月21日
0
0 Comments

现在尝试用每个长度为100个字节的字符串填充数组,看看它是否仍然释放所有分配的内存 ...

它是未定义行为,通常情况下,未定义行为可能会看起来工作。在您的情况下,内存中的对象没有解构函数,因此没有“进一步的工作”,只需释放所有内存[1]。但是,如果您有一个有用的解构函数的对象,它(可能)不会被调用。

如果您使用new T [size];分配,则应始终使用delete []。不要混合使用两种方法,这通常是错误的 - 只是有时它会“碰巧”起作用[就像在毫米螺母上使用英寸扳手集的某些尺寸,反之亦然- 但仍然使用在公制螺母上的英寸扳手集是错误的]。

[1]请注意,这可能适用于特定编译器/C ++库组合。使用不同的编译器,使用不同的C ++库或编译为不同的操作系统可能会导致您尝试相同操作时崩溃。

0
0 Comments

区别并不在于是否正确释放了分配的内存 - 无论你使用

delete

还是

delete[]

内存仍然会被正确释放。

区别在于是否正确调用了析构函数。

delete // will only invoke the destructor of the first element of the array.
delete[] // will invoke the destructor for *each* element of the array.

这对于像int或float这样的基本类型没有实际影响,但当你有某个类的数组时,差异可能是关键的。

0