首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分配空间失败时函数返回值

分配空间失败时函数返回值
EN

Stack Overflow用户
提问于 2012-08-19 19:57:26
回答 7查看 124关注 0票数 1
代码语言:javascript
复制
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。

附注-这是一个非常基本的问题,不能将我的问题形式化为任何简洁的形式,以便在谷歌上搜索。

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-08-19 20:00:57

在函数分配自己的内存并返回指向它的指针的分配失败的情况下,返回NULL是一种习惯。有关示例strdup(),请参阅。请注意,如果运算符new无法分配内存,则它会抛出std::bad_alloc,因此如果您希望返回NULL,则可能需要捕获此异常,或者,您可以让std::bad_alloc传播到函数之外。

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-19 20:00:33

operator new抛出异常(nothrow operator new除外),所以你可以捕捉这个异常并返回null pointer,或者重新抛出,或者抛出其他异常。

票数 1
EN

Stack Overflow用户

发布于 2012-08-19 20:11:20

如果分配失败,new运算符会抛出bad_alloc异常。因此,您可以捕获此异常并处理错误。

例如:

代码语言:javascript
复制
#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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12026276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档