Как я могу удалить нединамически выделенный массив в C ++? - PullRequest
0 голосов
/ 17 марта 2012

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

Ответы [ 5 ]

3 голосов
/ 17 марта 2012

Краткий ответ: вы не можете.

Более длинный ответ привел бы к очень грязным и зависимым от ОС взломам.

3 голосов
/ 17 марта 2012

Если вы хотите изменить размер, вы должны выделить его динамически, предпочтительно используя std::vector.

1 голос
/ 17 марта 2012

Если вы хотите вручную управлять временем жизни памяти, вам нужно использовать динамическое выделение памяти. Нединамически выделенная память (статически распределенная) будет освобождена только тогда, когда память выходит из области видимости. Поскольку эта память находится в объекте, которым вы управляете, эта память выходит из области видимости только тогда, когда объект-владелец освобожден.

Таким образом, вам нужно будет динамически распределять буфер при создании, затем при изменении размера выделять новый буфер, копировать содержимое из старого буфера в новый буфер, удалять старый буфер, а затем назначать внутренний указатель вашего объекта новому буферу. Что-то вроде:

// allocate a new, bigger array
Cell* newBuff = new Cells[/*newSize*/];

// copy into the new array
for (i = 0; i < myBufferSize; ++i)
{
   newBuff[i] = myBuffer[i];
}
// delete the old array
delete myBuffer;
// point to the new array
myBuffer = newBuff;

Не могли бы вы основать свою хеш-таблицу на std::vector вместо использования ручного выделения памяти? Это будет обрабатывать динамический массив для вас, и вы можете изменить размер с помощью простого .resize:

myBuffer.resize(/*newSize*/)
0 голосов
/ 17 марта 2012

Есть десятки способов справиться с этим.Конечно, «освобождение» памяти, которая не была выделена в куче, - худший способ взломать.

Я могу предложить что-то вроде этого:

0 голосов
/ 17 марта 2012

Предположим, у вас есть что-то вроде этого:

TableEntry table[max_table_size];

вам понадобится отдельная переменная, которая указывает, какой массив вы фактически используете:вы просто используете эту переменную вместо того, чтобы пытаться изменить размер фактического массива.

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