2

2 つの構造体と 1 つの動的割り当てを持つ非常に単純なコードがあります。「nume」の初期化でプログラムがクラッシュします。

typedef struct{
    int key;
    string name;
} TElement;

typedef struct nod {
   int cheie;
   string nume;
   struct nod *stg, *dr;
} NOD;

これをやろうとすると

void ABC::inserare_element(TElement e){
    NOD *p, *q;
    int n;
    /* construction nod p*/
    n=sizeof (NOD);
    p=(NOD*)malloc(n);
    p->cheie = e.key;
    p->nume = e.name; // on this line the program crashes

ありがとう

4

3 に答える 3

7

malloc()のコンストラクターは呼び出されませんNOD。つまり、のコンストラクターは呼び出されず、構築されていない/初期化されていない: useでnume使用しようとします。std::string::operator=std::stringnew

于 2012-06-03T20:22:28.597 に答える
4

std::stringここでは、 などの高レベル C++ オブジェクトと などの C スタイルのメモリ割り当てが混在していますmalloc。問題は、C++ のnew演算子がメモリを割り当てるだけでなく、高レベル オブジェクトのコンストラクターも呼び出すことです。あなたが直面している問題はnume、タイプのオブジェクトがstd::string適切に初期化されていないため、クラッシュにつながる未定義の動作に遭遇することです。それはあなたが幸運だからです。プログラムが実際に動作しているのに、奇妙で予期しない結果を生み出していたら、もっとひどいことになっていたかもしれません。

必要に応じて機能させるには、new代わりにmalloc. 例えば:

p = new NOD;

mallocC++ オブジェクトを気にしないまたはその他のメモリ管理 API を本当に使用する必要がある場合はnume、プレースメント new を使用して手動でコンストラクタを呼び出す必要があります。例えば:

p = (NOD*)malloc(n);
new ((void *)&p->nume) std::string();

その場合は、デストラクタも呼び出すことを忘れないでください。そうしないと、メモリリークが発生します。

于 2012-06-03T20:27:53.090 に答える
3

malloc の代わりに new を使用する必要があります。malloc は C 関数であり、メモリのチャンクのみを割り当てます。new を使用すると、クラスのデフォルト コンストラクターが呼び出され、この時点で文字列コンストラクターも呼び出されます。

于 2012-06-03T20:26:01.333 に答える