2017-04-23 107 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异常。