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

时间:2012-08-19 11:57:26

标签: 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。

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

7 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在分配失败的情况下,从分配自己的内存并返回指针的函数返回NULL是一种自定义。请参阅示例strdup()。请注意,如果操作符new无法分配内存,则会抛出std::bad_alloc,因此如果要返回NULL,可能需要捕获此值,或者可以让std::bad_alloc传播出函数。

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

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

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

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

答案 2 :(得分:1)

如果分配失败,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;
}

EDIT1:如果您使用的是C ++ 11功能,请忘记NULL0并改用nullptr

答案 3 :(得分:0)

如果返回值是指针,则NULL是出错时最合乎逻辑的值。您还可以查看引发异常,但现在返回NULL应该符合您的需求。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

 { return NULL;}

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