Копирование из одного динамически распределенного массива в другой C ++ - PullRequest
5 голосов
/ 09 ноября 2011

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

void ResizeArray(int *orig, int size) {
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++)
        resized[i] = orig[i];
    delete [] orig;
    orig = resized;
}

Похоже, что здесь происходит то, что resized[i] = orig[i] копирует значения по ссылке, а не по значению, так как печать оригинала после изменения размера возвращает кучу ненужных значений, если я не закомментирую delete [] orig.Как я могу сделать глубокую копию с оригинала, чтобы изменить размер, или есть какая-то другая проблема, с которой я сталкиваюсь?Я не хочу использовать std :: vector.

Ответы [ 3 ]

8 голосов
/ 09 ноября 2011

Помните, параметры в C ++ передаются по значению. Вы присваиваете resized для копии переданного вам указателя, указатель вне функции остается прежним.

Вы должны использовать двойное косвенное указание (или «двойной указатель», то есть указатель на указатель на int):

void ResizeArray(int **orig, int size) {
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++)
        resized[i] = (*orig)[i];
    delete [] *orig;
    *orig = resized;
}

или ссылка на указатель:

void ResizeArray(int *&orig, int size) {
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++)
        resized[i] = orig[i];
    delete [] orig;
    orig = resized;
}

Кстати, для размеров массива вы должны использовать тип std::size_t из <cstddef> - он гарантированно удерживает размер для любого объекта и дает понять, что мы имеем дело с размером объекта.

4 голосов
/ 09 ноября 2011

Я настоятельно рекомендую заменить массивы на std::vector<int>.Эта структура данных изменится по мере необходимости , а изменение размера уже было проверено.

2 голосов
/ 09 ноября 2011

orig должен быть указателем на указатель, чтобы присвоить его resized:

int **orig;
*orig = resized;
...