#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <map>
using namespace std;
char a[10];
map <string, char*> mm;
void update(string s, char* b)
{
delete mm[s];
mm[s] = b;
}
int main()
{
char* ptr = new char[100];
char* ptr1 = new char[100];
mm.insert(pair<string, char*>(string("abc"), ptr));
update ("abc", ptr1);
delete ptr1;
return 0;
}
私のコードは多少このようです。キーを使用して値を削除しようとすると、Valgrindはリークを示します。マップからエントリを削除すると、Valgrindのリークが表示されます。
しかし、上記のコードを同じValgrindで試しても漏れがないことを示しています。このようなマップで削除を使用すると、そこに不利な点はありますか?イテレータを割り当てて、それを削除しようとしました
delete itr->second;
これは問題なく動作しています。漏れはありません。最初の削除方法の問題は何ですか?
をなぜあなたはすべての生のポインタがありますか? –
あなたは正しい形式の削除を要求していません。 'delete []'ではなく、 'delete'でなければなりません。また、なぜこのようなコードを意図的に書くのでしょうか?単純に 'map'ではないのですか? –
PaulMcKenzie
これは、学習目的のためのおもちゃのコードであり、本番では 'char * 'を使用しないことを期待しています。さもなければ 'delete ptr1'は' mm'が後に使われるなら、未定義の動作を引き起こします。ところで、 'delete mymap [key];'は、 'key'が存在しなければ何も削除しないので、一般的に扱いにくいです。イテレータと一緒に行くのが常に良いです。 @Paulで述べたように、配列の場合は 'delete []'を呼び出す必要があります。 – iammilind