2010-05-15 48 views
0

嘿,那里,我正在写一个模板容器类,并在过去的几个小时一直试图分配新的内存额外的数据进入容器(...击中砖墙..:|)为容器类分配额外的内存

template <typename T> 
void Container<T>::insert(T item, int index){ 
    if (index < 0){ 
     cout<<"Invalid location to insert " << index << endl; 
     return; 
    } 


    if (index < sizeC){ 
    //copying original array so that when an item is 
    //placed in the middleeverything else is shifted forward 
     T *arryCpy = 0; 
     int tmpSize = 0; 
     tmpSize = size(); 
     arryCpy = new T[tmpSize]; 
     int i = 0, j = 0; 
     for (i = 0; i < tmpSize; i++){ 
      for (j = index; j < tmpSize; j++){ 
       arryCpy[i] = elements[j]; 
      } 
     } 
     //overwriting and placing item and location index 
     elements[index] = item; 
     //copying back everything else after the location at index 
     int k = 0, l = 0; 
     for (k =(index+1), l=0; k < sizeC || l < (sizeC-index); k++,l++){ 
      elements[k] = arryCpy[l]; 
     } 
     delete[] arryCpy; 
     arryCpy = 0; 
    } 

    //seeing if the location is more than the current capacity 
    //and hence allocating more memory 
    if (index+1 > capacityC){ 
     int new_capacity = 0; 
     int current_size = size(); 
     new_capacity = ((index+1)-capacityC)+capacityC; 
     //variable for new capacity 

     T *tmparry2 = 0; 
     tmparry2 = new T[new_capacity]; 
     int n = 0; 
     for (n = 0; n < current_size;n++){ 
      tmparry2[n] = elements[n]; 
     } 
     delete[] elements; 
     elements = 0; 
     //copying back what we had before 
     elements = new T[new_capacity]; 
     int m = 0; 
     for (m = 0; m < current_size; m++){ 
      elements[m] = tmparry2[m]; 
     } 
      //placing item 
     elements[index] = item; 
    } 

    else{ 
     elements[index] = item; 
    } 
    //increasing the current count 
    sizeC++; 

我的测试条件是 集装箱CNT4(3); 只要我碰到第四个元素(当我用于例如something.insert("random",3);)它崩溃,并且上述不起作用。我哪里错了?

回答

0

几件事情没有什么太大的意义对我说:

if (index+1 > capacityC){ 

应该不就是:

if (index >= capacityC){ 

而且,当你长大的阵列,我不明白为什么你正在进行两次复制。切忌:

delete[] elements; 
elements = 0; 

是:

delete[] elements; 
elements = tmparray2; 
0

注意new T[n]可能不是你真正想要在T容器是什么,因为这已经创建n个对象T。你真正想要的是保留内存,然后在稍后的某个时间点构建内存中的T类型的对象。

T* data = static_cast<T*>(operator new[](n * sizeof(T)); // allocate memory 
// ... 
new(&data[size]) T(arguments); // construct T object in-place 
++size; 

为了破坏容器,你必须颠倒过程:逐个销毁对象,然后释放内存。

while (size) data[--size].~T(); // destruct T object in-place 
operator delete[](data);   // release memory