2017-05-28 1 views
1

ここでは結果のない2D配列を削除しようとしています。2D_arrayエラーを削除します

私はこの構造体があります示したように、私は、動的に2次元配列を作成しています機能の一つで

struct Node { 
char Object[32]; 
int Link_num; 
char **Links; 
Node *Next; 
}; 

record->Links = new char*[record->Link_num]; 
    for (int i = 0; i < record->Link_num; i++) { 
     record->Links[i] = new char[16]; 
     cin.getline(record->Links[i], 16, '\n'); 
    } 

そして今、私はいくつか削除してアレイを削除しようとしています機能:

if (ptr->Link_num > 0) { 
     for (int i = ptr->Link_num; i > 0; --i) 
      delete[] ptr->Links[i]; 
     //delete[] ptr->Links; 
    } 

私はこのエラーを取得する:

Exception thrown at 0x50EE436B (ucrtbased.dll) in Test_10.exe: 0xC0000005: Access violation reading location 0xFDFDFDED. occurred. 
+0

に変更し、それを、それは 'int型私= ptr-> LINK_NUMすべきではない - 1' ? –

+3

単に 'std :: vector 'を使うのではなく、 'new'' delete'を使うのはなぜですか? –

+0

ギルベイツ、そうです!この問題を解決した問題が解決しました。ありがとう) πάνταῥεῖは、問題の解決であるように見えますが、まだベクトルを使用する方法を学んでいませんでした。ありがとう) – Taxon

答えて

1

for (int i = ptr->Link_num; i > 0; --i)からループが実行される。ループは、ptr->Link_numから1(すなわち、 [ptr->Link_num, 0))。配列の範囲は[0, ptr->Link_num)で、ptr->Link_numは含まれていません。だからあなたは配列の範囲から抜け出しています。この動作は定義されておらず、エラーが発生するのは "運が良かった"ことです。

for (int i = ptr->Link_num - 1; i >= 0; --i) 
    delete[] ptr->Links[i]; 
delete[] ptr->Links; 

または(あなたが逆の順序でループにそれを必要としない)

for (int i = 0; i < ptr->Link_num; ++i) 
    delete[] ptr->Links[i]; 
delete[] ptr->Links; 
+0

Opsは、それに注意を払っていませんでした。問題は解決しました、ありがとうございます)) – Taxon

関連する問題