【问题标题】:Stack around variable is corrupted error围绕变量的堆栈已损坏错误
【发布时间】:2014-07-15 13:45:06
【问题描述】:

我正在编写以下代码,但出现Stack around variable is corrupted 错误。我检查了类似的帖子,但无法将问题联系起来。我对 C++ 也很陌生。这是我的代码。

///CLASS DEFINITION
class Trellis{

    private:
        int m;
        int Nstates;
        int StateTransition[];

    public:
        Trellis(); 
        Trellis(int M);
};

这里是方法的定义

Trellis::Trellis(int M){
    m = M;
    Nstates = pow(2, M - 1);

    for (int i = 0; i < Nstates; i++){
        StateTransition[i] = i;
    }
}

int main() {

Trellis Tu = Trellis(3);

返回 0; }

我得到的错误是运行时检查失败#2-围绕变量“Tu”的堆栈已损坏;

【问题讨论】:

  • StateTransition 看起来不对...
  • 你应该提供整个错误信息。

标签: c++


【解决方案1】:

您没有为StateTransition 分配任何内存,您需要类似:

StateTransition = new int[Nstates];

在 ctor 中的 for 循环之前。

【讨论】:

  • @user63050 进行更改后是否收到不同的错误消息?请在您的问题帖子中提供完整的错误消息。
  • 我更新了帖子。我得到的新错误是错误 C2440: '=' : cannot convert from 'int *' to 'int []'
  • @user63050 数组可能会衰减为指针,但在这种情况下不会,请使用 int*
【解决方案2】:

Flexible array members 是 C99 的一项功能,可让您执行类似的操作

struct header {
    size_t len;
    unsigned char data[];
};

并且,只要您有正确的内存布局,您就可以访问和写入 data 数组。

在您的情况下,您没有为 StateTransition 变量提供任何内存,因此会覆盖其他一些堆栈数据。

你最好做类似的事情

class Trellis
{
private:
  int m;
  int Nstates;
  int *StateTransition; // Pointer

public:
  Trellis(); 
  Trellis(int M);
  ~Trellis();
};
Trellis::Trellis() : StateTransition(0) {
}
Trellis::Trellis(int M) : StateTransition(0)
{
  m = M;
  Nstates = pow(2, M - 1);

  StateTransition = new int[Nstates]; // Allocate memory

  for (int i = 0; i < Nstates; i++)
  {
    StateTransition[i] = i;
  }
}

Trellis::~Trellis() {
    if(StateTransition != 0)
        delete[] StateTransition; // Always be a good citizen
}

至于rule of three,您可能还想编写一个复制构造函数。

【讨论】:

  • 非常感谢。 U 规则
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
相关资源
最近更新 更多