2011-08-16 3 views
0

最近、このランタイムエラーが発生しました。これは、クライアントが別のプロセスアドレス空間に注入されたDLLであり、サーバが古典的なスタンドアローンプログラムであるクライアント/サーバアプリケーションです。これは、コードのincriminatedビット(私は、ファイルの非関連部分を削除した)されて:あなたは、私は2つのコンストラクタを持っているが、それらはpratically署名以外は同じです見ることができるようにクラスのコンストラクタに仮引数を1つ追加すると、C++のメモリアクセス違反が起こります。

#include "TableInfo.h" 

TableInfo::TableInfo(tstring id) { 
    this->id = id; 
} 

TableInfo::TableInfo(int num, tstring id) { 
    //this->num = num; 
    this->id = id; 
} 

void TableInfo::dump() { 
    //tcout << "num = " << this->num << endl; 
    tcout << "id = " << this->id << endl; 
} 

TableInfoには、クライアントからTPCソケットを介してサーバーに送信しようとしている別のオブジェクトに後で埋め込まれる情報が含まれている必要があります。これは私がそれを行う方法です。

TableInfo tt(999, L"MEGAOHM"); // WORKS! 
//TableInfo tt(L"MEGAHOM2"); // DOESN'T WORK! 
IpcRequest rr(CBE_NEW_TABLE); 
rr.setTableInfo(tt); 
c.sendRq(rr); 

ので、IpcRequestクラスが1つのTableInfoのインスタンスといくつかの他の変数を含むだけで、別のクラスであり、それは、サーバーにオーバー送信されます。 sendRq関数は、オブジェクト全体をサーバーに送信し、そこに含まれるデータを表示しようとします。あなたが2引数のコンストラクタを呼び出すと、コードからわかるように、そうでなければメモリアクセス違反エラーが発生します。デバッガによれば、エラーは関数内のTableInfoのidフィールドにアクセスしようとすると発生します。 これは何が関係するのか本当にわかりませんが、もちろん2つ以上の引数を持つコンストラクタを使用することはできますが、問題はなくなりますが、どうすればこのことが可能か知りたいと思います。

PS:tstringは、UNICODEの設定に応じてwstringまたはstringに解決されるマクロです。

+0

'TableInfo'には' virtual'関数や 'virtual'関数を持つ基本クラスがありますか? –

+0

このような不思議で非論理的なバグは、通常、コード内で惑星が整列しているときに最適化されるコードに間違った兆候があることを示しています。惑星が整列していなければ、バグが引き起こされます。あなたは最適化をコンパイルしていますか? –

+0

いいえ、TableInfoには仮想関数はありません。正直言って、すべてのコードに単一の仮想関数はありません。 また、最適化に関する限り、私はVisual Studio 2008の「標準的な」設定でコンパイルしています。つまり、何かを瞬時に有効にしませんでした。プロジェクトの「最適化」タブを見ると、すべて「デフォルト」 –

答えて

3

通常、このような場合、問題はメモリがプログラムのどこかで壊れていることです。 DLLなので、あなたのOSはWindowsだと思います。だから無料ツールApplication Verifierを使うことができます。 ヒープ構造を保護するオプションをオンに設定するだけです。メモリの破損につながるコードを見つけるのに役立ちます。

+0

私はあなたの提案をお試しください。ありがとう! –

+0

あなたのベアボーンの例を構築して実行するのに問題はありませんでした。 (私はtypedef'd WCHAR *からtstringへ) 古い言葉があります: "問題があなたが探している場所でないなら、あなたが探している場所ではありません!" :-) Application Verifierにショットを与えます。 – Gnawme

+0

Mmh、コードの配置方法はわかりませんが、2つの理由から実際に問題を再現できないと思います。まず、サーバー上で発生し、ここにコードを掲載していません。第二に、これはフックを注入したDLLからそのコードを実行していることに関連している可能性があります。 私はApplication Verifierを試しましたが、今のところそれをどのように使用するか分かりません。 –

関連する問題