函数返回的值会导致堆栈溢出吗?

问题描述

因此,我有以下代码,其中在 heap 上有一个类 x ,并返回其。假设如果在堆栈上声明res,则会导致堆栈溢出。然后,在下面的代码中,由于我要返回存储在堆中的 value ,是否会导致堆栈溢出?我是否必须返回指向 x 的指针?

x func ()
{
   x* res = new x;
   // code
   return *res;
}

int main ()
{
   x* s = new x;
   *s = func();
}

,我知道我没有delete字符串。

编辑:从std::string更改为class x

解决方法

详细说明我的评论。通常,如果sizeof(X)(其中X是您的类型)不是非常大-不应在设计良好的应用程序中使用它,则不会导致堆栈溢出。

但是,您可以尝试一下示例,并检查在大型数据结构的情况下会发生什么:

// very bad 1MB structure
struct X
{
  char data[1024*1024];
};

int main() {
  std::cout << sizeof(X) << std::endl;
  auto x = foo();
  // data[0] is undefined,printing to prevent compiler from optimizing it out
  std::cout << x.data[0] << std::endl;
  return 0;
}

现在使用valgrind运行它,并将stacksize设置为小于1MB:

valgrind --main-stacksize=1000000 --leak-check=full --log-file=vg.valgrind ./xxx

您可能会得到类似以下的输出:

Process terminating with default action of signal 11 (SIGSEGV)
Access not within mapped region at address 0x1FFEEFFB60
Stack overflow in thread #1: can't grow stack to 0x1ffeeff000

注意:溢出是由函数调用本身引起的,而不是由存储返回的值引起的,此示例就足够了:

int main()
{
  foo();
  return 0;
}

但是,如果-O1没有任何副作用,则foo或更高的gcc会对其进行优化。您可以使用-O0进行编译,以查看简化示例中的溢出。

struct X的简单改进,以避免在堆栈上分配大量数据:

struct X
{
  X(): data(1024*1024,'x') {}
  std::string data;
};
,

函数返回的值会导致堆栈溢出吗?

返回值可以存储在堆栈中。如果堆栈中存储的任何内容都超出堆栈的容量,则可能会导致堆栈溢出。

在一个示例调用约定中,调用方为返回值分配堆栈空间,并在其后存储参数,在这种情况下,如果返回值使堆栈溢出,则会在函数被调用之前发生。

...会导致堆栈溢出吗?

可能是。这是一个演示:http://coliru.stacked-crooked.com/a/daca31b6551d1be5

如果涉及优化以避免生成临时对象,则不能保证堆栈溢出。启用优化的同一示例:http://coliru.stacked-crooked.com/a/11fd38960fd62155

我是否必须返回一个指向x的指针?

如果类型sizeof非常大,则应避免像通过自动存储声明变量,创建临时对象或作为值参数传递一样,按值返回它。 >

在此示例中,std::unique_ptr可能是一个不错的选择。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...