-1

解決策が見つかりました

問題の説明:古いCライブラリを使用していて、関数の引数としてconstchar*を受け取っていたクラスがありました。この関数は、動的オブジェクトを作成し、constchar*を引数として使用してリンクリストに格納していました。

問題は、そうした後、関数に渡されたconstchar*がクラス外のメモリで変更されたことでした。これにより、ノード内のデータが破壊されました。

解決策:クラスのデータ型としてstd::stringを使用します。const char *が値として文字列に渡されると、文字列がメモリ管理を自動的に処理します。

私が学んだことは?C ++を使用する場合は、常に文字列を使用し、一部のCライブラリで必要な場合はstring.c_str()でのみchar*を使用してください。

みんなありがとう。あなたは私の週末を救った。

4

2 に答える 2

1

バフはスタック上に作成されます。バフをCache.findに渡し、最終的にノードのキーになります。次に接続を処理するときに、buffが宣言された関数を終了したため、buffが占有していたメモリが再利用されました。そのため、キーが消えたり、ゴミ箱に入れられたりします。基本的に、無効になったメモリへのポインタがあります。

これがまさに、自分でロールするのではなく、std::mapを使用する理由です。

さらに、同期せずにグローバル変数を変更する複数のスレッドがあるようです。

于 2013-03-24T17:37:13.383 に答える
0

あなたはそれをさらに煮詰めることができます。コードをざっと見てみると、これは私の推測です。基本的に、あなたが間違っているのはこれです:

const char* a;
{
  std::string f("foo");
  a = f.c_str();
}
doSomethingWith(a);

char*私のアドバイス:完全に離れてください。絶対に使用しなければならない場所がある場合は、オブジェクトの存続期間と、ポインターを保持してもその存続期間が延長されない方法について学習してください。「よく理解するまで使わない」という意味ではありませんchar*。よく理解しているのに、できる限り使わないようにしています。つまり、「Cコード(またはこの点でCコードのように見えるC ++コード)で作業している場合はそれらを使用してください」</p>

さらに、上記のコメントは絶対に真実です。問題を可能な限り切り詰めて(すでに答えが得られる可能性があります)、ここで自己完結型の方法で説明します。

于 2013-03-24T17:33:42.130 に答える