32 のストレージを割り当てても、std::set
このメモリ範囲を初期化していません (つまり、のコンストラクタstd::set
が呼び出されていません)。したがって、操作/アクセスしようとしているメモリは未定義の動作entry[0].insert (23)
を引き起こします。 .
C++ オブジェクトを と と同等のものと混在させることは、通常 (" alwaysmalloc
"と書きたくなる) 悪い習慣と見なされます。
代わりに、メモリoperator new
を割り当てて適切な方法でオブジェクトの構築を処理するのに目を向けます。また、メモリを解放してシステムに戻すために割り当てられたメモリを覚えておいてdelete
ください (そして、オブジェクトを真の方法で破壊します)。
C ++でそれを行う適切な方法
一部の回答には、 を使用した方がよいというテキストが含まれますがstd::vector<std::set>
、それは実際には質問に対する回答ではないため、この例のスニペットを残します。
int
main (int argc, char *argv[])
{
std::set<int> *entries = new std::set<int> [32];
entries[0].insert (123);
delete [] entries;
}