函数在无法分配空间时返回值
Function return value when fail to allocate space
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功能,请忘记NULL
或0
,改用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 指针。
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 使用 std::p air 进行返回值优化
- 函数在无法分配空间时返回值