我知道这个话题已经被打败了。但是问题还是出现了:
众所周知,在 C 语言中,严格不建议从函数返回原始数组,因为函数将返回的不是数组,而是指向它的指针,然后删除分配的内存可能会出现问题:它不会适用delete于指针的意义。但它是一个指向数组的指针。那为什么不申请delete[]呢?
#include <iostream>
int *getArray()
{
int* tab = new int[30];
return tab;
}
int main()
{
int* arrayFromFunction = getArray();
std::cout << arrayFromFunction[0];
delete [] arrayFromFunction;
}
是否符合标准?有些人声称这个选项非常有效。他们可以信任吗?
这里唯一的问题是,在宇宙飞船在 C++17 空间漫游并且已经接近 C++20 系统的时候,你正在做手动内存管理。
什么是变量
tab,什么arrayFromFunction,它们都有类型int*。是的,这样的指针可以指向标量值和它们的数组。delete这就是为什么/的误用错误是可能的delete[]。释放内存时,您总是需要知道指定地址的内容。在您的情况下,数组始终放置在地址处(标有new[]),因此您需要使用 删除它delete[],而不是delete。否则,抓住未定义的行为。在您的代码中,假设函数被简单地插入 (
inline) 在调用站点(不再作为被调用函数存在),然后:将变成:
在这里,我认为,您不再对代码的有效性有疑问。事实上,这些代码段给出了相同的结果。
但是如果你的函数
getArray变成了这样的东西:然后,根据条件
c,将返回一个数组或单个数字。对于所有这一切,您必须匹配正确的调用delete或delete[]为了使程序保持正确。你可以相信。
因为它是在文档本身中写的:
这使我们可以得出结论,在您的情况下,将调用一个简单的全局删除运算符。
该函数只会返回一个指向内存中特定位置的指针。它不会威胁任何坏事。