1
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 - 这是一个非常基本的问题,无法将我的问题形式化为任何简洁的形式,以便通过 Google 进行搜索。

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

4

7 回答 7

1

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

于 2012-08-19T12:00:33.273 回答
1

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

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

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

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

此外,如果您使用new分配,您应该使用正确版本的delete解除分配(这里delete[]因为您分配了一个数组)。您用于free()释放分配给malloc()和朋友的内存。

于 2012-08-19T12:00:57.323 回答
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

于 2012-08-19T12:11:19.513 回答
0

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

于 2012-08-19T11:59:52.213 回答
0

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

于 2012-08-19T12:01:25.043 回答
0

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

于 2012-08-19T12:02:23.863 回答
0
if(!a) // what should I return here if allocation of a fails 

 { return NULL;}

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

于 2012-08-19T12:03:11.873 回答