2017-04-23 1 views
0

これは基本的なことですが、それを乗り越えることはできません。 私の配列にx回のy要素を追加したいと思います。 1x100000要素を追加すると問題ありません。 しかし、5000x5000要素を追加しようとすると、即座に停止し、さまざまなエラーが発生し、不正なallocは発生しません。誰かが私にこのについての手掛かりを与えることができれば は私がextremaly gladfulだろう...ダイナミックアレイに新しい要素を追加するC++

#include <iostream> 
#include <numeric> 
#include <chrono> 
#include <cstdlib> 

class Array 
{ 
    int *tab; //dynamic array 
    int cnt; //count 
public: 
    Array(); 
    void clearArray();//deleting table 
    void test_addValueToArray(int index, int value); 
}; 

Array::Array() : tab(nullptr), cnt(0){;} 

void Array::clearArray() 
{ 
    if(cnt==0) 
     return; 
    delete tab; 
    cnt=0; 
} 

void Array::test_addValueToArray(int index, int value) 
{ 
    int *NewTab = new int[cnt+1]; 
    for(int i=0;i<index;++i) 
     NewTab[i]=tab[i]; 
    NewTab[index]=value; 
    for(int i=index+1;i<cnt+1;++i) 
     NewTab[i]=tab[i-1]; 
    delete[] tab; 
    tab=NewTab; 
    ++cnt; 
} 

Array myArray; 

int main() 
{ 
    int elements, times; 
    std::cout<<"How many elements?"; 
    std::cin>>elements; 
    std::cout<<"How many times?"; 
    std::cin>>times; 
    auto start = std::chrono::high_resolution_clock::now(); 
    for(int j=0; j<times; ++j) 
    { 
     for(int i=0; i<elements ; ++i) 
      myArray.test_addValueToArray(0,rand()%1000); 
     myArray.clearArray(); 
    } 
    auto stop = std::chrono::high_resolution_clock::now(); 
    std::chrono::duration<double> time=stop-start; 
    std::cout<<"Avarage time:"<<time.count()/times<<"\n"; 
} 
+0

最初の問題:clearArrayでは、おそらく 'delete [] tab;'であり、 'delete tab;'ではありません。 第2の問題:clearArrayを呼び出した後にtab [i]にアクセスするとどうなりますか? – wolff

答えて

0

問題は、continiousメモリ割り当て解除のロットの[]ので、削除の使用である プラスあなただけのタブを削除して使用していましたスマートポインタを使用できるようにcleararrayの[]タブを削除するように変更する必要があります。あなたのtest_addValueToArray()では、cnt = 0のときに、割り当てられていないメモリを解放しようとしていますが、addValueToArray()を呼び出す際にインデックスとして0を渡す理由がわかりませんでした。私はその時点で。

これを修正してスマートポインタを使用すると、しばらく実行した後にbad_alloc例外が表示されるはずです。

関連する問題