0

クラスの1つで作成したプライベート変数を参照しようとすると、プログラムがクラッシュし続けるという苛立たしい問題が発生しています。どこが悪いのかわからない。クラッシュするクラスを呼び出すクラスは次のとおりです。

#include <stack>
#include <fstream>
#include <ostream>
#include <cstdlib>
#include <string>
#include <set>
#include "schemeList.cpp"

using namespace std;

class dataLog
{
public:
stack<string> commands;
set<string> domain;
processor tokens;
int nextToken;
schemeList * s;
dataLog(stack<string> s, ofstream * out, processor p, int location)
{
    commands = s;
    tokens = p;
    nextToken = location;
    commands.push("<Query List>");
    commands.push(":");
    commands.push("Queries");
    commands.push("<Rule List>");
    commands.push(":");
    commands.push("Rules");
    commands.push("<Fact List>");
    commands.push(":");
    commands.push("Facts");
    commands.push("<Scheme List>");
    commands.push(":");
    commands.push("Schemes");
    checkNext();
}

void checkNext()
{
    for(int i = 0; i < tokens.tags.size(); i++)
    {
        if(commands.top().compare(tokens.tags[i].getName())!=0)
        {
            if(commands.top().find("<")==0)
            {
                if(commands.top().compare("<Scheme List>")==0)
                {
                    int output = (*s).process(i, tokens, domain);                       string hi = (*s).toString();

                }
            }
        }
        commands.pop();
    }

}
};

このクラスは、SchemeListクラスのオブジェクトを作成します。これは次のように書き出されます。

#include "schemes.cpp"
#include <cstdlib>
#include <string>
#include <set>
using namespace std;

class schemeList
{
private:
string success;

public:
int process(int number, processor p, set<string> domain)
{
    success = "HELLO";
    return 13;
}

string toString()
{
    return success;
}

};

15行目に到達するとすぐにsuccess = "HELLO";、プログラムがクラッシュしてメッセージが表示されます

Unhandled exception at 0x00E48B66 in lab2.exe: 0xC0000005: Access violation reading   
 location 0xCCCCCCE4.

Windowsデスクトップ用のMicrosoftVisualStudioExpress2012を使用しています。

4

3 に答える 3

3

まず、変数schemeList * dataLog::sが初期化されることはないため、変数へのアクセスは未定義の動作であり、クラッシュにつながります。ダングリングポインタでプロセスを呼び出し、所有していないメモリに書き込もうとしている可能性があります。

第二に、しないでください#include "schemeList.cpp"cppファイルを含めることは想定されていません。むしろ、宣言と実装を分離し、ヘッダーを含めます。

于 2012-09-24T08:11:29.737 に答える
1

を初期化していませんdataLog::s。を呼び出すと(*s).process(i, tokens, domain)、未定義の動作が発生します。

于 2012-09-24T08:15:45.983 に答える
0

まず、ヘッダーにソースコードファイルが含まれているようです。これにより、1つの定義規則が破られ、ひどく間違ってしまう可能性があります。

第二に、「s」はクラスメンバーにとってあまり良い名前ではありません。それはそれの用途を見つけることをほとんど不可能にします。

第三に、sを初期化するコードがどこにも見当たりません。どこで参照されるかはわかりますが、初期化されていないため、間接参照の効果は定義されておらず、運が良ければプログラムがクラッシュするだけで、何が起こっているように見えます。

于 2012-09-24T08:16:11.910 に答える