使用struct作为函数崩溃程序的返回值

时间:2015-01-28 14:33:39

标签: c++ struct iostream

我想使用struct作为fucntion的返回值,但它不起作用,我不知道为什么。运行此程序时程序崩溃。我得到了RTE。这段代码出了什么问题:

#include <iostream>

using namespace std;
    struct Tablica{
        int T[201][201];
    };

    Tablica test(Tablica A, int m){
       if(m==1)return A;
       if(m%2 ==1){
            return test(A, m-1);
       }else{
           cout <<" #1 m " << m<<endl;
            Tablica B = test(A,m/2);
            cout <<" #2 m " << m<<endl;
            return B;
       }

    }
int main(){
    Tablica T;
   test(T,10);

}

enter image description here

1 个答案:

答案 0 :(得分:6)

让我们算一下:结构的大小几乎是160kB(201 * 201 * 4(sizeof(int))),每次调用在堆栈上创建其中两个实例,一个用于参数A ,一个用于变量B,意味着每个调用使用大约320kB的堆栈。你有三个电话,所以这是960kB。 {strong> Plus T函数中的原始变量main,将用于1120kB的堆栈大小增加到超过1024kB的默认进程堆栈大小视窗。导致堆栈溢出和崩溃。

绝对最简单的解决方案?使函数的参数成为常量引用,即

Tablica test(const Tablica& A, int m)

这个问题是你在堆栈上每次调用时仍然至少有一次实例,即变量B,这样只需要在堆栈用完之前再给你一些递归调用。

更复杂的解决方案是对结构中的数据使用std::vector,这会将数据放在堆上并使结构的数量小一些。这与上面使用参数的解决方案一起使用是一个更长期的解决方案,并且在用完堆栈之前会允许你进行大量的递归调用。它不会永远持续下去,但是堆栈是一种有限的资源,迟早你仍然会耗尽。

不推荐的解决方案是增加流程的堆栈大小,这仅适用于上述最后一个解决方案达到限制的情况,但是在增加堆栈大小之前,您应该开始考虑其他更好的设计来解决问题