0

そこで、メニューを使用してさまざまなハッシュ手法をテストするクラス用のドライバーを作成しました。私が持っているのは、すべての仮想関数と、さまざまな方法でハッシュする5つの異なる子クラスを持つ抽象クラス「BaseHash」です。私がこれをするとき:

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が呼び出された瞬間にスタックオーバーフローエラーが発生します。デバッガーでは、エラーをスローする前に1つのステップを実行することさえできません。

重要な場合、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 に答える