1

メンバーの1つがマップである構造体を構築しています。
最初の質問 これは許されますか? コンパイラは文句を言いませんでした。

struct A {  
  map<int, float> B;  
}  

後で、そのようなデータ型の配列を宣言します。

A *C = (A *)INTERNAL_CALLOC(..., sizeof(A));  

ここで、関数INTERNAL_CALLOCは MALLOC の関数ラッパーです。
コードの後半で、配列の最初の要素のマップに項目を初めて挿入しようとしたときに、コア ダンプが発生しました。

C[0].B[0] = 0.001;  

なぜこれが当てはまるのですか?
ありがとう!

4

6 に答える 6

6

はい、構造体のマップは問題ありません。

で割り当てることmallocは間違いなく問題ありません。コンストラクターは呼び出されません。したがって、マップを使用しようとすると、マップはおそらくひどいことをします。

一般的な経験則: C++ ではmalloc/ calloc/ realloc/を使用しないでください。free可能な限り動的割り当てを避け、やむを得ない場合はnew/を使用してくださいdelete*


* そして、スマート ポインタについて調べてください。

于 2013-01-11T01:07:36.623 に答える
3

本当に INTERNAL_CALLOC で割り当てる必要がある場合は、placement new を使用してください。

まず、型 A のコンストラクタとデストラクタを定義するか、A をクラスとして定義する必要があります。

struct A {
  A(){}
  ~A(){}
  map<int, float> B;  
};

次に、単に呼び出すことができます:

//Allocate an A, uninitialized
A *C = (A *)INTERNAL_CALLOC(..., sizeof(A));  
//Initialize the newly allocated A
new (C) A();

後でオブジェクトを解放するときは、デストラクタを明示的に呼び出す必要があります。

//A *C;
C->~A();
INTERNAL_free(C);
于 2013-01-11T01:37:47.937 に答える
1
A *C = (A *)INTERNAL_CALLOC(..., sizeof(A));  

ここであなたはコンパイラに嘘をついています。INTERNAL_CALLOCからの戻り値が を指すことを伝えていますがA、そうではなく、ゼロを指すだけです。を使用しnewます。

于 2013-01-11T01:28:18.693 に答える
0

メンバーとして使用するので、コンテナとしてプレーン配列の代わりにstd::map使用することをお勧めします。std::vector

次のように実行できます。

struct A
{
    std::map<int, int> B;
};

std::vector<A> vecofmap;    

A elem0;
A elem1;
A elem2;

vecofmap.push_back(elem0);
vecofmap.push_back(elem1);
vecofmap.push_back(elem2);

vecofmap[0].B[0] = 100;

std::cout << vecofmap[0].B[0] <<std::endl;

そうすれば、メモリ割り当てを気にする必要はありません。

于 2013-01-11T04:50:55.593 に答える
0

malloc を使用してメモリを割り当てても、配列要素は初期化されません。

于 2013-01-11T01:07:16.410 に答える
0

std::map<whatever...>メモリをゼロバイトで埋めても有効になりません。

ある程度、POD 型 (ほぼ「純粋な C」データ構造) で可能です。

于 2013-01-11T01:08:34.307 に答える