2013-06-19 2 views
0

Я пытаюсь реализовать функцию, которая может увеличить размер динамического массива любого типа данных на единицу, имея массив, содержащий все существующие данные.Функция для изменения размера любого динамического массива

Я хочу сделать это, так как мы регулярно должны использовать и изменять размеры динамических массивов для практических проектов в классе, так что, насколько я бы хотел, я не могу использовать векторы.

Сначала я хотел бы знать, можно ли это сделать, и если да, то кто-нибудь может показать мне, как это сделать.

Это то, что у меня есть до сих пор.

template <typename Temp> 
void incArraySize(Temp * dynamicArray, int i_Elements) 
{ 
    Temp * dummyArr = new Temp [i_Elements]; 
    for (int l = 0; l < i_Elements; l++) 
     dummyArr[l] = dynamicArray[l]; 

    delete [] dynamicArray; 
    dynamicArray = new Temp [i_Elements+1]; 

    for (int l = 0; l < i_Elements; l++) 
     dynamicArray[l] = dummyArr[l]; 

    delete [] dummyArr; 
} 

Это нормально работает при первом вызове функции, но я получаю нарушение доступа для последующих периодов времени.

ответ

1

dynamicArray должны быть переданы по ссылке,

void incArraySize(Temp*& dynamicArray, int i_Elements) 

иначе переприсваивания в линии dynamicArray = new Temp [i_Elements+1]; не будет применяться за пределами функции.

То есть, когда вы звоните

int* array = new int[10]; 
incArraySize(array, 10); 
// line 3: 
std::cout << array[0]; 

в строке 3, как массив удалять [] ред incArraySize, но переменная array все еще указывает на эту старую, удаляемого, массив. Вот почему вы получаете нарушение доступа.


Вы считаете std::vector<Temp>? Стандартный тип библиотеки может правильно управлять памятью и размером и намного проще в использовании.

+0

Большое вам спасибо. Я бы никогда не получил это сам. Наверное, я все еще немного изучаю, чтобы делать это по указателям и ссылкам, поскольку эти темы все еще немного расплывчаты для меня. –

1

Увеличение размера массива на единицу будет невероятно неэффективным, особенно если вам нужно сделать это несколько раз. Я предлагаю жертвовать некоторой памятью и использовать больше места, чем вам нужно, или использовать список, в котором вы можете использовать метод .push()

В вашем текущем методе похоже, что вы копируете указатели на новый массив, а не на копируя отдельные значения из фиктивного массива в динамический массив, попробуйте использовать новое ключевое слово внутри цикла for, чтобы убедиться, что вы передаете данные каждый раз, когда вы его скопируете за

0

Почему две копии? И поскольку KennyTM отметил, что вам нужна ссылка:

template <typename Temp> 
void incArraySize(Temp *& dynamicArray, int i_Elements) 
{ 
    Temp * p = new Temp[i_Elements + 1]; 

    for (int l = 0; l < i_Elements; l++) 
     p[l] = dynamicArray[l]; 

    delete [] dynamicArray; 

    dynamicArray = p; 

} 
Смежные вопросы