0

所以我为类编写了一个驱动程序,它使用一个菜单来测试不同的散列技术。我拥有的是一个抽象类“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 时出现堆栈溢出错误。调试器甚至不让我在抛出错误之前迈出一步。

如果重要的话 myList 看起来像这样

BaseHash *myList;

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

4

2 回答 2

1

我想通了。我忘记了堆栈上只有有限的空间,我需要使用“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;

        }
    }
于 2013-01-26T01:22:01.587 回答
1

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

于 2013-01-26T01:22:56.420 回答