最近、このランタイムエラーが発生しました。これは、クライアントが別のプロセスアドレス空間に注入された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に解決されるマクロです。
'TableInfo'には' virtual'関数や 'virtual'関数を持つ基本クラスがありますか? –
このような不思議で非論理的なバグは、通常、コード内で惑星が整列しているときに最適化されるコードに間違った兆候があることを示しています。惑星が整列していなければ、バグが引き起こされます。あなたは最適化をコンパイルしていますか? –
いいえ、TableInfoには仮想関数はありません。正直言って、すべてのコードに単一の仮想関数はありません。 また、最適化に関する限り、私はVisual Studio 2008の「標準的な」設定でコンパイルしています。つまり、何かを瞬時に有効にしませんでした。プロジェクトの「最適化」タブを見ると、すべて「デフォルト」 –