2016-05-17 5 views
-2
struct try 
{ 
    int elem; 
    map<int , int *> mymap; 
}; // simple structure containing int and a map 
struct try * var; // pointer to try structure 
var = (struct point *) malloc(sizeof(struct point)); 
var->mymap[1]=(int *)malloc(sizeof(int)); // want to add(1,pointer to integer) 

segmenation障害を表示ので、最後の行の構造体で宣言されたときに値をマップに挿入する方法は?

+1

多分最初の行は 'struct try'の代わりに 'struct point'と言うべきでしょうか? – matiu

+2

また、それはC++であり、cではありません。 mallocの代わりにC++メモリ管理を使うほうがいいです。おそらくあなたはマップが必要です。指針は全くありませんか? – matiu

+1

'struct try'は私のためにエラーを生成します。あなたのコンパイラとコンパイルフラグは何ですか? – Garf365

答えて

1

かわりmallocnewを使用する必要があります。

確か
struct point 
{ 
    int elem; 
    map<int , int *> mymap; 
}; // simple structure containing int and a map 
point * var; // pointer to try structure 
var = new point; 
var->mymap[1]=new int; 

newはメモリを割り当て、コンストラクタを呼び出します。ここでは、メモリのみを割り当てるmallocでは、メンバmymapのコンストラクタは呼び出されないので、まだmymapは初期化されていないため、使用時に未定義の動作が発生します。

あなたの代わりにmalloc/free

のC++ =>new/deleteを使用して、私は残って削除させていただきますそのあなたのstructにデストラクタを追加するために良いことができると思い際にC-ようなコードを記述しないでください。ブーストスマートポインタからstd::unique_ptrstd::shared_ptr、またはC++の古いバージョンのために、同等クラス:あなたがC++ 11以上、スマートポインタを見てみましょうを使用する場合は、メモリを回避するためにmymap内のポインタは、最後に

を漏らす

struct point 
{ 
    int elem; 
    map<int , std::shared_ptr<int>> mymap; 
}; // simple structure containing int and a map 
// for c++14 or greater: 
auto var = std::make_unique<point>(); 
//or c++11: 
std::unique_ptr<point> var(new point); 
// for both 
var->mymap[1]=std::make_shared<int>(); 
+2

いいえ、あなたは 'new'も使うべきではありません。それはもう1990年代じゃない! –

+0

@LightnessRacesinOrbitもちろん、私の編集を参照してください。しかし基本的な基本操作を理解することが重要です – Garf365

+0

それを理解してください。それらを使用しますか?いいえ。 –

関連する問題