0

C++ プロジェクトに厄介なバグがあります。クラスがあります

class SomeClass {
    ...
    std::string *someString;
    ...
}

ここにコンストラクタがあります

SomeClass(...) {
    ...
    someString = new std::string("");
    ...
}

そして問題は、その後、ポインター値を変更せずに、その特定の文字列のみを操作することです。私はその文字列に常に異なる文字列を割り当てます。

*someString = "whatever";
someString->assign("whatever");
*someString += 'a';

アプリケーションはマルチスレッドであり、非常に厄介な問題があります。ある時点で、アプリケーションがクラッシュします。デバッガーは、変数 someString に BAD POINTER があることを示しています。そして、私はこれがどのように可能かわかりません

delete someString;

決して呼び出されません。

私はその文字列ポインタのすべての参照を調べましたが、ここに私があなたに伝えることができるものがあります:

  1. そのポインターの削除は呼び出されません。
  2. そのポインターは他のものに割り当てられることはありません (後で削除される可能性があります)。
  3. その文字列のポインター値は決して変更されません (デバッガーは「Bad Ptr」を示します)。
  4. 他のクラス変数は、本来あるべきように問題ないようです。

したがって、特定のオブジェクトでデストラクタが呼び出されたときを確認する方法を見つける必要があります。実際、オブジェクトの配列。

では、特定のオブジェクト セットのデストラクタ (またはその他のメソッド) にブレークポイントを設定する方法はありますか (私はビジュアル スタジオ 2010 プロフェッショナルで作業しています)。

4

1 に答える 1

1

マルチスレッドを使用している場合は、文字列メンバーにロック メカニズムを実装することを検討してください (まだ実装していない場合)。あるスレッドが、別のスレッドで再割り当てされているポインターに書き込もうとする可能性が非常に高い...またはこのようなものです。もう少しコードを追加すると、より深いコンテキストで問題を理解するのに役立ちます。

于 2013-05-06T11:16:59.273 に答える