如何解决函数返回的值会导致堆栈溢出吗?
因此,我有以下代码,其中在 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
可能是一个不错的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。