堆栈周围的变量是损坏的错误

时间:2014-07-15 13:45:06

标签: c++

我正在编写以下代码,我收到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 - 围绕varuble'Tu'的堆栈已损坏;

2 个答案:

答案 0 :(得分:4)

您没有为StateTransition分配任何内存,您需要以下内容:

StateTransition = new int[Nstates];
在你的for循环之前

答案 1 :(得分:0)

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,您可能还想编写一个复制构造函数。