2016-11-09 10 views
0

2Dのダイナミック配列に問題があります。コードはここにあります:動的な2D配列を削除できない

//Inicialization 
char** arr = new char* [size]; 
for(int i = 0; i < size; i++) 
    arr[i] = new char[70]; 

基本的に最大70文字の文章です。 Ok ...私はそのように以前に使った。 私はそれを離脱したい - 私はあまりにもそれをやった!

//Deleting 
for(int i = 0; i < size; i++) 
    delete [] arr[i]; 
delete [] arr; 

そして、これはと右I = 0でクラッシュします: "式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)"。

しかし、私が言ったように - 私は、このように別のプロジェクトでそれを使用:

//Init 
char** vety = new char* [pocVet]; 
for(int i = 0; i < pocVet; i++) 
    vety[i] = new char[100]; 
//Something (again a few sentences). 
//Deleting 
for(int i = 0; i < pocVet; i++) 
    delete [] vety[i]; 
delete [] vety; 

私はここでどこにでも見て、それは同じです。なにが問題ですか? PS:それが動作する2番目の例では、私の母国語では異なる名前は気にしません。

編集:おそらくそれは配列の内容のためでしょうか?しかし、2番目の場合(それが動作する場所)には、その中の文章もあります。私はちょうどそれに質問の束を持って、ユーザーが唯一のアクションを選択してください - そうbasiclyそれだけの文章です:

arr[0] = " 1 - Use something\n"; 
arr[1] = " 2 - Use different thing\n"; 
arr[2] = " 3 - etc...\n"; 
arr[3] = " 4 - etc\n"; 
arr[4] = " 5 - etc\n"; 
arr[5] = " 6 - etc\n"; 
arr[6] = " 7 - etc\n"; 

私はprintfの...それで何もしません();

+3

問題は、あなたが新しいアレイを使用する方法である限り、文字列リテラルは、サイズであるとして、あなたのために働く必要があります。 [あなたが投稿したもの](http://ideone.com/L3tg7j) – StoryTeller

+2

は、割り振りとそれに続く削除の間のどこかで配列ポインタを踏んでいる可能性があります。 – Alnitak

+4

確かに。私はちょうど2つのコンパイラであなたの初期コードを走らせました。問題はありません。 ... [mcve]が呼び出されます。 –

答えて

4

ポインタarr[0]を文字列リテラルを指すように再割り当てします。

arr[0] = " 1 - Use something\n"; 

だからあなたはあなたが割り当てられたメモリリークが発生し、その後、あなたが割り当てられませんでしたメモリにdelete[]を呼び出そう。

解決策は、自分自身で生ポインタを混乱させるのではなく、難しい作業を行うために標準ライブラリを使用することです。

std::vector<std::string> v; 
v.emplace_back(" 1 - Use something\n"); 
// Other sentences 
1

sprintfは70未満

sprintf(arr[0], " 1 - Use something\n"); 
関連する問題