【问题标题】:C++ Stack Overflow ErrorC++ 堆栈溢出错误
【发布时间】:2012-10-24 05:06:05
【问题描述】:

我正在努力让自己习惯在 C++ 中使用动态数组,现在我已经第十次陷入困境。该程序编译得很好,但是在接受输入后它给出了堆栈溢出错误,并且我提供了删除构造函数中的堆的功能,我假设我有一个未启动的变量,但我真的找不到它。希望大家帮我看看。这是代码:

#include<string>
#include<cmath>
#include<sstream>
using namespace std;
#include"Calc.h"
#include<iostream>
using namespace std;

Calc::Calc(int a, int*b){
length=a;
ar=b;
AR =new int*[length];


for (int i=0; i<length;i++){
    AR[i] = new int [ar[i]]();
    }

for (int i = 0; i < length; i++)
    delete[] AR[i];
    };

Calc::~Calc(){};

int Calc::solveFor(int m0, int n0){
int ans=0;
if (m0=0) {ans =n0+1; AR[m0][n0]=ans; return n0+1;}
if (n0=0) {ans= solveFor(m0-1,1); AR[m0][n0]=ans;return ans;}
else {ans=solveFor(m0-1, solveFor(m0, n0-1));AR[m0][n0]=ans; return ans;}
};



void Calc::getSolved(){
for(int i=0; i<=length; i++){cout<<endl;
    for (int j=0; j<ar[i]; j++)
        cout<<"ACK ["<<i<<","<<j<<"]="<<AR[i][j]<<"  ";}
    cout<<endl;


};

Run.cpp:

#include<iostream>
#include<string>
#include "Calc.h"

using namespace std;

int main() {
int m;
int n;
int v[6]= {7, 7, 7, 7, 7, 7};
Calc XXX(6, v);
cin>>m;
cin>>n;


XXX.solveFor(m,n);
XXX.getSolved();

  return 0;
}

提前致谢。

【问题讨论】:

  • 你的 constructor 不应该立即释放它分配的内存。将delete 循环移动到析构函数

标签: c++ stack-overflow


【解决方案1】:

我在Calc::solveFor 中看到的一个问题是您使用赋值运算符代替相等:

if (m0=0)

应该是

if (m0==0)

【讨论】:

    【解决方案2】:

    除了上面提到的 =/== 问题之外,您似乎正在递归计算 Ackermann function。此函数的递归深度增长得太快,无法以这种方式执行:“A(4, 2) 不可能在任何可处理的时间内通过简单的 Ackermann 函数递归应用来计算。”

    尝试使用迭代方法,或查看 memoization。

    【讨论】:

    • 迭代方法似乎过于庞大,但如果它是我唯一的选择,我会尝试一下
    • Ackermann 函数非常适合记忆化。使用预先计算的函数值的二维数组,用标记值初始化,比如 -1,每次调用函数时,检查当前参数的值(== 数组位置)是否已经计算过。如果是这样,只需使用该值。如果不是,则计算返回值并将其存储在数组中。这样,您可以节省大量递归,不再有堆栈溢出,代码运行得更快,并且您可以继续使用递归方法...
    【解决方案3】:

    Ackermann 函数的值增长非常快,对于m&gt;3,它会溢出用于结果的int。这可能是无限递归的原因。

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 2016-01-17
      • 2014-01-26
      • 2019-02-16
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多