2017-04-23 97 views
0

我知道這些都是基礎知識,但我無法克服它。 我想將x個y元素添加到我的數組中。 當我添加1x100000元素時很好。 但是,當我嘗試添加5000x5000元素時,它會立即停止,並出現許多不同的錯誤,從不會導致分配錯誤。 我會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中,您可能不想刪除[]選項卡;',而不是'刪除選項卡;'。 第二個問題:如果在調用clearArray之後訪問tab [i]會發生什麼? – wolff

回答

0

問題是因爲使用刪除[]爲許多continious內存釋放, 加你只用刪除選項卡應該將其更改爲在cleararray中刪除[]選項卡,以便您可以使用智能指針。

plus:在你的test_addValueToArray()當cnt = 0時,你試圖解除分配根本沒有分配的內存,我不明白你爲什麼傳遞0作爲索引,同時調用addValueToArray()我認爲它應該是我在那個時候。

所以一旦你解決這個問題,並使用智能指針,它應該工作,否則它會運行一段時間後顯示bad_alloc異常。