首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何处理或避免C++中的堆栈溢出

如何处理或避免C++中的堆栈溢出
EN

Stack Overflow用户
提问于 2012-08-28 00:57:03
回答 5查看 48.2K关注 0票数 35

在C++中,堆栈溢出通常会导致程序不可恢复的崩溃。对于需要真正健壮的程序,这是不可接受的行为,特别是因为堆栈大小是有限的。关于如何处理这个问题的几个问题。

  1. 提供了一种通用技术来防止堆栈溢出。(一个可伸缩的、健壮的解决方案,包括处理外部库吞噬大量堆栈等)
  2. 有没有办法在堆栈溢出发生的情况下进行处理?最好的情况是,在有处理程序来处理这类问题之前,堆栈会一直展开。
  3. 有一些语言,它们有可扩展堆栈的线程。

:这样的事情在C++中是可能的吗?

对于C++行为的解决方案,任何其他有用的意见都将不胜感激。

EN

回答 5

Stack Overflow用户

发布于 2012-08-28 01:42:22

您可以使用良好的编程实践来防止堆栈溢出,例如:

  1. 对递归非常小心,我最近看到一个由于写得不好的递归CreateDirectory函数导致的错误,如果你不确定你的代码是否100% ok,那么添加保护变量,它将在N个递归调用后停止执行。或者更好的是不要写递归函数。
  2. 不会在堆栈上创建巨大的数组,这可能是隐藏的数组,比如一个非常大的数组作为类字段。使用向量总是更好。
  3. 在使用alloca时要非常小心,特别是当它被放入一些宏定义时。我见过许多这样的结果,字符串转换宏放入循环,使用alloca的快速内存allocations.
  4. Make确保您的堆栈大小是最佳的,这是更重要的嵌入式平台。如果你的线程做的不多,那么给它小的堆栈,否则使用更大的堆栈。我知道预留应该只占用一些地址范围,而不是物理内存。

这些是我在过去几年中见过的最多的原因。

对于自动查找SO,您应该能够找到一些静态代码分析工具。

票数 10
EN

Stack Overflow用户

发布于 2012-08-28 02:02:33

Re:可扩展堆栈。你可以像这样给你自己更多的堆栈空间:

代码语言:javascript
复制
#include <iostream>

int main()
{
    int sp=0;

    // you probably want this a lot larger
    int *mystack = new int[64*1024];
    int *top = (mystack + 64*1024);

    // Save SP and set SP to our newly created
    // stack frame
    __asm__ ( 
        "mov %%esp,%%eax; mov %%ebx,%%esp":
        "=a"(sp)
        :"b"(top)
        :
        );
    std::cout << "sp=" << sp << std::endl;

    // call bad code here

    // restore old SP so we can return to OS
    __asm__(
        "mov %%eax,%%esp":
        :
        "a"(sp)
        :);

    std::cout << "Done." << std::endl;

    delete [] mystack;
    return 0;
}

这是gcc的汇编语法。

票数 4
EN

Stack Overflow用户

发布于 2012-08-28 01:20:49

C++是一种强大的语言,随之而来的是搬起石头砸自己的脚的能力。我不知道有什么便携机制可以在发生堆栈溢出时检测和纠正/中止。当然,任何这样的检测都是特定于实现的。例如,g++提供了-fstack-protector来帮助监控堆栈使用情况。

一般来说,您最好的办法是主动避免大型基于堆栈的变量,并小心处理递归调用。

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

https://stackoverflow.com/questions/12146201

复制
相关文章

相似问题

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