Realloc изменение размера массива

у меня есть сомнения по поводу использования функции realloc() в C++. Мне нужно, чтобы в основном изменить размер массива, удалив первый элемент. Это то, что я сделал

cell* Queue::pull() {
    cell* data = cellArray[0];
    arrayLen--;
    cell** temp = (cell**)realloc(cellArray+1, sizeof(cell*)* (arrayLen));
    if (temp == NULL) {
        return 0;
    }
    cellArray = temp;
    return data;
}

arrayLen является целым числом и хранит текущую длину очереди, а cellArray представляет собой массив ячеек *, который был выделен и заполнен ранее.

cell** cellArray;
int arrayLen = 0;

Моя проблема: это вызывает утечку памяти? Освобождает ли realloc пространство, которое использовалось первым элементом массива, или это в основном то же самое, что и что-то вроде:

cell** temp = cellArray+1;

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


person Gioele Zacchia    schedule 30.03.2017    source источник
comment
Не определено передавать realloc любой указатель, который не был возвращаемым значением одной из функций выделения C. cellArray+1 не является таким указателем.   -  person molbdnilo    schedule 30.03.2017
comment
функция realloc() в C++ Верно... почему вы используете realloc в C++??   -  person Lightness Races in Orbit    schedule 30.03.2017
comment
Если вы когда-нибудь сохраните объект C++ с конструкторами/деструкторами в этой штуке и прокрутите его через realloc, весь ад вырвется на свободу. Не делай этого.   -  person Jesper Juhl    schedule 30.03.2017
comment
Просто используйте уже std::vector и забудьте, что realloc, malloc и free существуют. А для динамического размещения даже забудьте, что new и delete существуют 99% времени, и просто используйте std::make_unique и std::make_shared.   -  person Jesper Juhl    schedule 30.03.2017


Ответы (1)


Если выделенная память расширена, верно следующее:

  • Если текущий сегмент памяти требуется после области памяти, то непосредственно расширите эту область памяти, realloc () вернется к исходному указателю.
  • Если свободных байтов за текущим сегментом памяти недостаточно, используйте первый блок памяти для удовлетворения этого требования, скопируйте текущие данные в новое место и освободите исходный блок данных. Возвращает новое местоположение блока памяти.
  • Если приложение не работает, вернет NULL, на этот раз исходный указатель все еще действителен.

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

person UKeeySDis    schedule 30.03.2017