函数在无法分配空间时返回值

Function return value when fail to allocate space

本文关键字:空间 返回值 分配 函数      更新时间:2023-10-16
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 .

PS - 这是一个非常基本的问题,无法将我的问题正式化为任何简洁的形式来搜索谷歌。

编辑:谢谢大家。我已经解决了我的问题.

习惯上

,如果分配自己的内存并返回指向它的指针的函数分配失败,则返回 NULL。例如,请参阅strdup() 。请注意,如果运算符new无法分配内存,则会抛出std::bad_alloc,因此如果要返回 NULL,则可能需要捕获此值,或者,可以让std::bad_alloc从函数中传播出来。

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

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

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

此外,如果使用new进行分配,则应使用正确版本的delete来解除分配(此处delete[],因为您分配了一个数组(。您可以使用free()来释放分配给malloc()和朋友的内存。

operator new抛出异常(nothrow operator new 除外(,因此,您可以捕获此异常并返回 null pointer 、重新抛出或抛出其他异常。

如果

分配失败,new运算符将引发bad_alloc异常。因此,您可以捕获此异常并处理错误。

例如:

#include <new> // std::bad_alloc
int* foo(int n)
{
   int* a(new int[n]);
   return a; // I guess you want to return the address stored in a
}
int main()
{
   try
   {
      int* a(foo(n));
   }
   catch(std::bad_alloc& ba)
   {
      // Handle here the error (e.g: std::cerr << "Allocation failed:" << ba.what() << std::endl;)
   }
   return 0;
}

编辑1:如果您使用C++11功能,请忘记NULL0,改用nullptr

如果返回值是指针,则在发生错误时,NULL 是最合乎逻辑的值。您也可以考虑引发异常,但现在返回 NULL 应该适合您的需求。

在这种情况下,新运算符会抛出bad_alloc异常,您可能应该捕获它并根据您的要求处理它(http://www.cplusplus.com/reference/std/new/bad_alloc/(

它可以返回任何值。问题是你必须正确对待它。

if(!a) // what should I return here if allocation of a fails 
 { return NULL;}

这将意味着分配失败,即返回一个 NULL 指针。