-6

以下は大丈夫ですか?

int n=5;
map<string,int> * maps = (map<string,int> *)malloc(n*sizeof(map<string,int>));
for (int i=0; i<n; i++) {
    maps[i] = map<string,int>();
    char * i_str = (char *)malloc(10);
    sprintf(i_str,"%d",i);
    char * key = (char *)malloc(100);
    strcpy(key,"key");
    strcat(key,i_str);
    (maps[i])[string(key)] = i*i;
}

C++ では malloc ではなく new を使用するように言われていることを知っています。しかし、このようにすると、問題が発生する可能性がある場合はどうなりますか?

編集: コードは正常にコンパイルされ、正常に実行されます (g++ 4.6.3)。質問が保留になっている理由はわかりませんが、技術的に正しいかどうかを知りたいだけです(スタイルは気にしません)。よくわからないことの1つは、行が

maps[i] = map<string,int>();

構文的に正しいかどうか、また、ある人が示唆したように、それが実際に予期しない動作につながるかどうか.

私がやっていることは未定義であることを示す C++ 仕様への参照をまだ誰かが提供していません。したがって、この質問はまだ答えられていません。

4

2 に答える 2

2

命令:

map<string,int> * maps = (map<string,int> *)malloc(n*sizeof(map<string,int>));

マップを格納するためにメモリを予約しますが、メモリを初期化しません (コンストラクターを呼び出します) 。ほとんどの場合、ここでマップのコンストラクターには追加の動的割り当てが必要になります。

それで

maps[i] = map<string,int>();

operator=マップの以前のコンテンツをクリアし、新しい (空白の) コンテンツに置き換えるマップのコピー割り当てを呼び出します。ただし、元のマップは有効な状態ではないため、ここで問題が発生する可能性が高くなります。これは未定義の動作であり、何もしないか、クラッシュするか、ランダムに他のランダムなことを行う可能性があります。

また、記憶を失うことはないので、多くの記憶を失ってfreeいますmalloc

于 2013-07-17T23:23:46.477 に答える