c++ - 分配空间失败时的函数返回值

标签 c++ pointers

int main()
{

 cout<<"Enter n";

 cin >> n;

 int * a = new int[n];

 a = foo(n);

 free(a);

 return -1;

}

int * foo(int n)
{
 int * a = new int [n];

 if(!a) // what should I return here if allocation of a fails 

 {}

 free(a);


} 

在上面的代码中,我试图从 main 中捕获一个函数的返回值,该函数的返回类型是一个指针。但是我正在动态分配内存。那么,如果我的内存分配失败,我应该返回什么……任何特殊符号,如 NULL。

P.S - 这是一个非常基本的问题,无法将我的问题形式化为任何简洁的形式以便通过 Google 进行搜索。

编辑:谢谢你们所有人。我已经解决了我的问题。

最佳答案

在分配自己的内存并返回指向它的指针的函数分配失败的情况下,返回 NULL 是一种习惯。参见示例 strdup() .请注意,运算符 new 会在分配内存失败时抛出 std::bad_alloc,因此如果您想返回 NULL,您可能需要捕获它,或者您可以让 std::bad_alloc 传播出函数。

但是请注意,返回此类指针并不总是明智的,因为它会引发所有权问题并增加内存泄漏的可能性。

您可能会发现坚持 RAII惯用语使您的代码更易于推理并且不易出错。 RAII 习惯用法的一个结果是分配和释放由同一代码单元完成。

在您的特定情况下,您在 main() 中分配数组,因此您可以将指向它的指针传递给 foo() 并也在 main 中释放内存()

此外,如果您使用 new 进行分配,则应使用适当版本的 delete 进行释放(此处为 delete[],因为您分配了一个数组)。您使用 free() 来释放使用 malloc() 和 friend 分配的内存。

关于c++ - 分配空间失败时的函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12026276/

相关文章:

c - 类型 "const int** const"和 "int**"之间的初始化是不允许的,为什么?

C - 内存被释放后访问数据?

c - "&(epage->incoming[0]) = spage;"和 "&(epage->incoming[p2]) = spage;"之间的区别

c++ - 如何测试文件存储的浮点表示?

c++ - 在静态库和 DLL 中使用静态成员 - 成员值正在重置

c++ - 如何获取蓝牙HID设备的MAC地址?

c++ - 将 Protobuf 转换为具有类似功能的 ROS 消息

c - 将二维数组元素分配给单个指针

pointers - 尝试将指针传递给向量元素时,对变量的访问指定常量

c++ - 最低公共(public)祖先优化