0

次のようなコードを取得しました。

class TimeManager
{
public:
 virtual ~TimeManager();
};

class UserManager : virtual public TimeManager
{
public:
 virtual ~UserManager();
};

class Server : virutal public UserManager
{
 virtual ~Server();
};


CServer *pServer;

DWORD WINAPI ServerHelper(void*);

int main()
{
 //Create server
 CreateThread(NULL, 0, ServerHelper, NULL, 0, NULL);

 std::cin.get();

 //delete server
 delete pServer;

 std::cin.get();

 return 0;
}

DWORD WINAPI ServerHelper(void *v)
{
 pServer = new CServer;

 return 0;
}

私の問題は-推測-私のサーバーデストラクタが呼び出されないことです...

想像できません。理由:/ ...(3つのクラスすべてに出力関数を記述しましたが、サーバーコンストラクターは何も出力しませんが、他の両方は出力します... SECOND!キーを押した直後... (なぜ削除直後ではなく2番目なのですか?)

ヒント、ヒント、解決策はありますか?...

VisualStudio2010を使用しています

4

5 に答える 5

2

おそらくあなたは間違ったサーバークラスを見ています。CServer表示しているクラス定義がクラス用である間に、のインスタンスを作成しますServer。(あるいは、これも質問のタイプミスである可能性があります。)

また、キーボードを速く押すと、新しいスレッドが作成されてServerHelper関数が実行されるdelete前に、サーバーが作成される前に実行される可能性があります。deleteその後、nullポインタが表示され、何も実行されません。後で作成される実サーバーオブジェクトは破棄されません。

于 2010-08-26T17:24:52.580 に答える
1

これらのクラス定義を使用する(および残りは投稿したものと同じ)

class TimeManager 
{ 
public: 
 virtual ~TimeManager() { cout << "~TimeManager" <<endl; }
};

class UserManager : virtual public TimeManager 
{ 
public: 
 virtual ~UserManager() { cout << "~UserManager" <<endl; }

}; 

class CServer : virtual public UserManager 
{ 
public: 
 virtual ~CServer() { cout << "~CServer" <<endl; }
}; 

ランニングディスプレイ

~CServer
~UserManager
~TimeManager

1回目と2回目の間にEnterキーを押します---予想どおりです。あなたの問題は他の場所にあるようです。

また、CServerクラスには多くのタイプミスがあり、特に「CServer」と「Server」の場合があることに注意してください。また、「仮想」のスペルが間違っており、dtorはプライベートです。しかし、それらのいずれも、実行時エラーを引き起こさずに、コンパイルを妨げていたでしょう。

また、投稿したコードは仮想継承を必要としないことにも注意してください。あなたは不必要にキーワードを投げているか、あなたのクラスはあなたが許しているよりも複雑です。

于 2010-08-26T19:01:11.653 に答える
1

わかりました...問題の解決策を見つけました:

サーバーコンストラクター内からメインループを開始しました。

Server::Server()
{
MainLoop();       // <- Loop in there...
}

追加の関数を使用してサーバーを手動で起動することで修正しましたが、今ではすべてが正常です:D ...

参加してくださった皆様、ありがとうございました:)...

于 2010-08-26T19:35:31.027 に答える
0

CServerはあなたが定義していない他のクラスですか?クラスはサーバーとして定義されていますが、CServerを作成しています。

于 2010-08-26T17:26:44.953 に答える
0

そこで、このコードをコンパイルしようとしましたが、タイプミスを修正してもコンパイルされません。タイプミスを修正し、サーバーデストラクタを公開しました。すべてが期待どおりに機能します。サーバーデストラクタが最初に呼び出され、UserManagerが2番目に呼び出され、TimeMangagerが3番目に呼び出されます。

于 2010-08-26T17:43:32.567 に答える