массивы — C ++: использование динамического выделения памяти для написания функции, аналогичной функции C realloc () (т.е. изменение ее размера)

Я хотел бы написать функцию (changeSize), которая использует DMA, где я могу изменить размер (массива) на любой другой, где oldEls — это исходный размер, а newEls — новый размер. Если newEls больше, чем oldEls, я бы просто добавил нули в конец, а если он меньше, чем oldEls, я бы просто усек. Параметр «ptr» должен указывать на новый массив. Насколько я понимаю, это будет похоже на функцию C realloc ().

С кодом ниже, я вывожу следующее: 0, 0, 3, 6, 0, 0, 0, 0, где правильный вывод должен быть 4, 2, 3, 6, 0, 0, 0, 0. Я также понимаю, что моя функция показа, возможно, не самая лучшая функция для вывода нового массива, поскольку я должен явно указать размер элемента массива.

Заранее спасибо.

#include <iostream>
#include <cstdlib>

using namespace std;

void show( const int a[], unsigned elements );
int * copy( const int a[], unsigned els );
void changeSize( int * & ptr, int newEls, int oldEls );
void die(const string & msg);

int main()
{
int arr[4] = {4, 2, 3, 6};

show(arr, 4);

int * newArr = copy(arr, 4);

cout << endl << endl;

changeSize(newArr, 8, 4);
show(newArr, 8);

}

void show( const int a[], unsigned elements )
{

for (int i = 0; i < elements; i++)
cout << a[i] << endl;

}

int * copy( const int a[], unsigned els )
{
int *newArr;

try
{
newArr = new int[els];
}
catch(const bad_alloc &)
{
die("Copy: Alloc Failure");
}

for (int i = 0; i < els; i++)
newArr[i] = a[i];

return newArr;
}void changeSize( int * & ptr, int newEls, int oldEls )
{

int * newArr;

try
{

newArr = new int[newEls];
for (int i = 0; i < oldEls; i++)
{
newArr[i] = ptr[i];
}

if (newEls > oldEls)
{
for (int k = oldEls; k < newEls; k++)
newArr[k] = 0;
}
}

catch(const bad_alloc &)
{
die("changeSize: Alloc Failure");
}

ptr = newArr;
delete[] newArr;

}void die(const string & msg)
{

cerr << "Fatal error: " << msg << endl;
exit(EXIT_FAILURE);

}

1

Решение

Прежде всего, вы звоните удалить на newArr в конце changeSize, вам нужно удалить старое значение ptr (которое вы сейчас отбрасываете). Это (вероятно) проблема

Пока я в этом, я хотел бы обратить ваше внимание на std::vector, Это в основном массив с изменяемыми размерами.

Кроме того, копирование сырых блоков памяти еще лучше всего сделано с memcpy, не тратьте свое время на написание циклов просто для копирования ints, делайте это только для классов C ++.

РЕДАКТИРОВАТЬ: с помощью std::copy является лучшим решением для C ++, он использует memcpy когда это возможно, в противном случае это то же самое, что и для цикла копирования объектов.

Ура!

5

Другие решения


По вопросам рекламы [email protected]