0

これでメモリエラーが発生する理由を知りたいのですが:

問題はchar*value = aMap.find(keync)->secondに表示されます

手動でchar*value = "key0"を入力すると、機能します!!!

using std::map;
map <char*, char*> aMap;

void search(const char* key) {
    const int LEN = strlen(key);

    char* keync = new char[LEN];

    for (int i= 0; i < LEN; i++) {
       keync[i] = key[i];
    }

    char* value = aMap.find(keync)->second;

    printf("%s", value);

    delete[] keync;
}

int _tmain(int argc, _TCHAR* argv[])
{
    a["key0"] = "value0";
    search("key0");

    return 0;
}
4

6 に答える 6

2

配列の長さに 1 を追加する必要があります。

char* keync = new char[LEN+1];

割り当てた文字列の外でnull終端しています。

(また、aMap を初期化していますか?)

于 2010-08-30T04:24:47.447 に答える
1

他の人が指摘したように、これを使用する方がはるかに優れていますstd::string。さて、実際の問題として、文字列を見つけることができないのは、マップにポインターを格納しているためです。つまり、マップのキーはポインター変数です。マップに を挿入しchar*ましたが、見つけようとしているときに をnew再度実行しています。これはまったく異なるポインターです (ポインターが指す文字列値は同じですが)。したがって、ルックアップは失敗します。

于 2010-08-30T04:55:49.583 に答える
0

明らかな問題の1つは次のとおりです。

delete keync;

new []を使用したため、次のようになります。

delete[] keync;
于 2010-08-30T04:18:40.377 に答える
0
using std::map;
map <char*, char*> aMap;

まず第一に、このマップは(検索内の)文字列ではなくアドレスを比較します。したがって、基本的に、文字列リテラルを入力してもstd :: map::searchでは何も見つかりません。

void search(const char* key) {
    const int LEN = strlen(key);

    char* keync = new char[LEN];

    for (int i= 0; i < LEN; i++) {
       keync[i] = key[i];
    }

現時点では、文字列は終了していませんが、コードでは問題ありません

    char* value = aMap.find(keync)->second;

secondここでは、ポインターの値(アドレス)を比較して検索を実行しているため、返されたマップイテレーターは無効です(aMap.end()と等しい)。したがって、メンバーとしてnullまたは未割り当てのポインターがあります。

    printf("%s", value);

    delete[] keync;
}

int _tmain(int argc, _TCHAR* argv[])
{
    a["key0"] = "value0";
    search("key0");

    return 0;
}

char*の代わりにstd::stringを使用する理由が説明されていることを願っています。

于 2010-08-30T08:00:02.190 に答える
0

char* の代わりに std::string を使用することをお勧めします。std::string を使用するもう 1 つの利点は、メモリ リークを回避できることです。

もう1つの解決策は、 map に比較機能を提供することです。そうしないと、各 char* の内容を比較するのではなく、ポイントされたアドレスを比較します。次の例は、Sgi のstd::mapドキュメントから改作されました。

struct comp
{
  bool operator()(char* s1, char* s2) const
  {
    return strcmp(s1, s2) < 0;
  }
};

map<char*, char*, comp> stringMap;
于 2010-08-30T04:24:54.717 に答える
0

すべての char* のものをドロップして を使用する必要があるスターターを探してstd::stringください。これにより、おそらく問題が解決するでしょう。

参考までに:
keync[LEN] = '\0';// これは間違っており、割り当てられた配列の末尾の 1 つ後になります

キーパラメータのコピーが間違っています。これを試着してサイズを確認してください:

using std::map;
map <char*, char*> aMap;

void search(const char* key) {
    const int LEN = strlen(key);

    char* keync = const_cast<char*>(key);

    char* value = aMap.find(keync)->second;

    printf("%s", value);
}

int main(int argc, char** argv)
{
    aMap["key0"] = "value0";
    search("key0");

    return 0;
}

あなたが抱えていた問題は、ヌルターミネータをカウントしないkeyncとして割り当てていたためです。strlen(key)コピー ループでは、ヌル ターミネータを の最後の文字で上書きしていましたkey

入力文字列をコピーするという考え全体が間違っているため、ソリューションでそれを const キャストに置き換えました。

于 2010-08-30T04:27:02.030 に答える