выделение дополнительной памяти для класса контейнера - PullRequest
0 голосов
/ 15 мая 2010

Привет, я пишу класс контейнера шаблона и в течение последних нескольких часов пытался выделить новую память для дополнительных данных, поступающих в контейнер (... попал в кирпичную стену ..: |)

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);), он падает, и вышеописанное не работает. где я ошибся?

Ответы [ 2 ]

0 голосов
/ 15 мая 2010

Обратите внимание, что 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
0 голосов
/ 15 мая 2010

Некоторые вещи не имеют для меня особого смысла:

if (index+1 > capacityC){

не должно быть:

if (index >= capacityC){

Кроме того, когда вы увеличиваете массив, я не понимаю, почему вы делаете два больших копирования. не должны:

delete[] elements;
elements = 0;

быть:

delete[] elements;
elements = tmparray2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...