繁体   English   中英

结构构造函数的问题导致堆栈溢出

[英]Issue with struct constructor causing stack overflow

下面的代码两部分都是我实际代码的大大简化的隔离版本。 这些示例足够大,可以重现该问题。 下面的代码的第一部分工作正常。 本节是试图开始使其成为类的一部分。 我正在尝试采取一些小步骤,因为对如下所示的结构进行小的修改需要在整个代码中进行很多更改,这些代码充满了指针,指向指针的指针和引用,而这些都涉及此结构。 您能告诉我为什么第二部分代码在其构造函数中引发堆栈溢出,并且可以进行一些小的更改来修复它吗?

工作代码:

#include <cstdio>
#include <cstdlib>
#include <iostream>

using std::cout;
using std::endl;

const int maxSize = 3;

struct Item{
    int count;
    Item *items[maxSize + 1];   
};

void foo()
{
    Item *p;
    p = new Item();
    p->count = 2;
    cout << p->count << endl;
}

int main(int argc, char *argv[])
{
    foo();
    return 0;
}

尝试非常逐步地将代码整体修改为一个类:

#include <cstdio>
#include <cstdlib>
#include <iostream>

using std::cout;
using std::endl;

int maxSize = 3;

struct Item{
    int count;
    Item *items;

    Item()
    {
        items = new Item[maxSize + 1]; // stack overflow
    }
};

void Initialize(int size)
{
    maxSize = size;
}

void foo()
{
    Item *p;
    p = new Item();
    p->count = 2;
    cout << p->count << endl;
}

int main(int argc, char *argv[])
{
    Initialize(5);
    foo();
    return 0;
}

构造Item的第一个调用称为new Item[maxSize+1] ,后者调用默认的构造函数,后者调用new Item[maxSize+1] ,后者调用默认的构造函数,依此类推,直到达到堆栈溢出为止。

这是因为在工作版本中,您引用的是对象数组,而不是Items实际对象。 在第二个版本中,您正在使用关键字new创建对象。 因此,在构造函数的第二个版本中,它将自行调用! 它将无限次调用它自己的构造函数。 因此,您会看到运行时异常stackoverflow :)

所有答案都是正确的。 我想为您提供一个解决方案:您可以实现类似以下方法的初始化方法,而不是在ctor中初始化数组:

init(int maxSize) {
  items = new Item[maxSize + 1];
}

构造对象后可以调用的对象。 这应该避免堆栈溢出。 通常,应避免将对象实例放置在对象本身内部。 最好使用Item List<Item>, std::vector<Item>, Collection。

以上海报是正确的。 Item的构造函数中,您可以创建项目(通过创建数组)。 因此,再次调用了ctor,它创建了更多的项目,.....这或多或少是一个无限循环,吞噬了您的堆栈。 要么坚持引用,要么使用诸如List类的集合-这样您就可以在以后动态添加项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM