2017-06-07 8 views
-3

私はヒープ内の労働組合のためのメモリを割り当てていると私は労働組合の要素Idが900動的オブジェクトを削除する際にエラーが発生しましたか?

groupUnion[i]オブジェクトを削除するために私を助けてくださいときに労働組合のオブジェクトを削除する必要がある場合Idは900 は、以下の私のコードです。

groupUnion = (SettingsUnion *) malloc(sizeof(SettingsUnion) * (NumAttrs + 1)); 
if(groupUnion == (SettingsUnion *) NULL) 
{ 
    return (FALSE); 
} 

for (unsigned int i=0; i < NumAttrs; i++) 
{ 
    inFile.read(reinterpret_cast<char*>(&groupUnion[i]),sizeof(SettingsUnion)); 
    if(groupUnion[i].Id == 900) 
    { 
     free groupUnion[i]; // this is bad how can i delete groupUnion[i] when groupUnion[i].Id == 900 
     groupUnion[i] = NULL; 
    } 
} 

inFile.close() 

ありがとうございました!

+1

あなたは既にすべての途中でメモリの作品「割り振り解除」することはできませんメモリ。しかし、私はそれがあなたが望むものであることを非常に疑っています。メモリの割り当てを解除するともうアクセスできなくなり、Id == 900であることが分かりません。あなたは本当に何をしたいですか? – yeputons

+0

[このリンクはこちら](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)どのようにこれを行うことができます。 –

+1

C++でmalloc/freeを使用しないでください。 vector、unique_ptr、make_unique、new/deleteを使用してください。 –

答えて

0

あなたのコード・フラグメントfree groupUnion[i];groupUnion[i] = NULLは、私はあなたが実際にSettingUnion -objectsからのポインタの配列ではなく、SettingUnion -objectsの配列を表現したいことを想定することができます。 次のようにだからあなたのコードは(C++では、あなたが実際にnew/deleteを使用しても、私は、あなたのmalloc/freeスタイルを使用)のようになります。

groupUnion = (SettingsUnion **) malloc(sizeof(SettingsUnion*) * (NumAttrs + 1)); 
if(groupUnion == NULL) 
{ 
    return (FALSE); 
} 

for (unsigned int i=0; i < NumAttrs; i++) 
{ 
    groupUnion[i] = malloc(sizeof(SettingsUnion)); 
    inFile.read(reinterpret_cast<char*>(&groupUnion[i]),sizeof(SettingsUnion)); 
    if(groupUnion[i]->Id == 900) 
    { 
     free groupUnion[i]; 
     groupUnion[i] = NULL; 
    } 
} 
inFile.close() 
0

あなたが割り当てられたメモリの空き部分ができません:無料groupUnion [ i]はあなたがしかし、何ができるか

は、個々の要素を割り当て、その後、個別にそれらを解放することです:

// not sure why you need the +1 (anyway you allocate an array of pointers to the struct here. Consider using new operator) 
groupUnion = (SettingsUnion **) malloc(sizeof(SettingsUnion *) * (NumAttrs + 1)); 
if(groupUnion == (SettingsUnion *) NULL) 
{ 
    return (FALSE); 
} 

for (unsigned int i=0; i < NumAttrs; i++) 
{ 
    // you allocate the individual groupUnion here: 
    groupUnion[i] = (SettingsUnion *) malloc(sizeof(SettingsUnion)); 
    if(groupUnion[i] == (SettingsUnion *) NULL) 
    { 
     return (FALSE); 
    } 

    inFile.read(reinterpret_cast<char*>(&groupUnion[i]),sizeof(SettingsUnion)); 
    if(groupUnion[i].Id == 900) 
    { 
     free groupUnion[i]; // this is bad how can i delete groupUnion[i] when groupUnion[i].Id == 900 
     groupUnion[i] = NULL; 
    } 
} 

inFile.close() 
関連する問題