C++ 在main之后立即导致堆栈溢出的代码

C++ 在main之后立即导致堆栈溢出的代码,c++,hash,stack-overflow,C++,Hash,Stack Overflow,所以我为类编写了一个驱动程序,它使用一个菜单来测试不同的散列技术。我有一个抽象类“BaseHash”,包含所有虚拟函数和5个不同的子类,它们以不同的方式进行散列。当我这样做时: while (numChoice!=0){ switch(numChoice){ case 1: myList= &MyHashContainer(myStudentList.getStudentList(),myStudentList.getStudentList().size(

所以我为类编写了一个驱动程序,它使用一个菜单来测试不同的散列技术。我有一个抽象类“BaseHash”,包含所有虚拟函数和5个不同的子类,它们以不同的方式进行散列。当我这样做时:

while (numChoice!=0){
        switch(numChoice){
        case 1: myList= &MyHashContainer(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;
        case 2: myList= &hash2(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;
        case 3: myList= &chainingHash(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;
        case 4: myList= &quadraticHash(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;
        case 5: myList= &DoubleHash(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;

        }
    }
调用main时,我得到一个堆栈溢出错误。调试器甚至不允许我在抛出错误之前退出一步

如果重要的话,我的清单是这样的

BaseHash *myList;

如果我注释掉以while开头的代码,它不会抛出此错误。我甚至不知道从哪里开始,为什么会发生这种情况。

我知道了。我忘记了堆栈上只有有限的空间,我需要使用“new”关键字来确保所有这些都在堆上进行

while (numChoice!=0){
        switch(numChoice){
        case 1: myList= new MyHashContainer(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;
        case 2: myList= new hash2(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;
        case 3: myList= new chainingHash(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;
        case 4: myList= new quadraticHash(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;
        case 5: myList= new DoubleHash(myStudentList.getStudentList(),myStudentList.getStudentList().size(),p);break;

        }
    }

您正在为
myList
分配构造函数执行的临时结果的地址-此值是一个临时值,没有与之关联的地址,因此操作会导致未定义的行为。将返回值存储在临时变量中并获取其地址将解决技术问题,但是可能也有一个逻辑问题-尝试获取返回值的地址很可能是一个逻辑错误。

我担心您需要显示更多的代码如果您在main之前崩溃,您通常会遇到一些静态问题,这些静态问题在调用main之前被初始化。抱歉,伙计们,我一直没有想到这一点。我只使用高级语言,所以有时候我会被更粗糙的细节弄得一团糟。答复张贴below@Ukemi:这些类型中的一个或多个太大。使用
vector
而不是数组,并尽量使所有对象小于64字节。这确实解决了您眼前的问题,但原因不是您所描述的-请参阅我上面的答案。@icepack:事实上,这是他所描述的原因,与正确的解决方案非常相关。@MooingDuck否,这不是主要原因,只是副作用。对于他的情况,这可能是一个正确的解决方案(需要更多的数据才能得出结论),但堆栈不是这里的主要问题,原始代码引用临时地址,导致未定义的行为;这是非常错误的。@MooingDuck:事实上,冰袋是对的。虽然这当然是非常糟糕的C++风格,但没有技术原因,Ukemi不能拥有,例如,代码> alOrAuthAudio.[/COD] >对于最大的<代码> > siZOFF()/CODE的派生哈希类有足够的空间,然后使用放置<代码>新< /Cord>初始化每个代码> CASE < /C>中的适当哈希对象。所以这不是堆栈与堆的问题。@Ukemi使用临时对象的地址的问题在于,它是临时的-您不能相信地址是有效的,因为在没有您的干预的情况下,内存可以随时被释放或覆盖
new
在堆上分配一个非临时空间并将对象存储在那里-这就是区别所在,
new
的返回值是分配的非临时内存的地址。当不再需要使用
delete
时,应释放此内存,以避免内存泄漏如果返回值是引用,则获取返回值的地址是完全合法的操作。(顺便说一句,我不是向下投票人)@EduardoLeón这是对的,但在这种情况下,这些构造函数根据定义生成一个新对象(不是引用)。(OP说代码在任何行执行之前都有一个调用main的stackoverflow。是的,这是代码中的一个错误,但不是stackoverflow的原因。