Как обновить другие указатели, когда RealLoc перемещает блок памяти?

StackOverflow https://stackoverflow.com/questions/2172127

  •  24-09-2019
  •  | 
  •  

Вопрос

Ссылка Realloc говорит:

Функция может перемещать блок памяти в новое местоположение, и в этом случае возвращается новое местоположение.

Значит ли это, что если я сделаю это:

void foo() {

        void* ptr = malloc( 1024 );

        unsigned char* cptr = ( unsigned char* )ptr+256;

        ptr = realloc( ptr, 4096 );
}

Тогда CPTR может стать недействительным, если RealLoc перемещает блок?

Если да, то, то никак не содержит сигнал Realloc, что он переместит блок, чтобы я мог сделать что-то, чтобы предотвратить недействительность CPTR?

Это было полезно?

Решение

Да, cptr станет недействительным, поскольку Realloc перемещает блок! И нет, нет упоминания о сигнализации вам, чтобы сказать, что он перемещает блок памяти. Кстати, ваш код выглядит IFFY ... Читать дальше ... Пожалуйста, смотрите мой отвечать на другой вопрос и очень внимательно прочитайте код о том, как он использует realloc. Отказ Общий консенсус, если вы сделаете это:

void * ptr = malloc (1024); / * позже в коде * / PTR = RealLoc (PTR, 4096); / * БАМ! Если Realloc не удалось, ваша драгоценная память набивается! * /

Способ обойти, это использовать временный указатель и использовать это, как показано:

void * ptr = malloc (1024); / * позже в коде * / void * tmp = realloc (ptr, 4096); если (tmp! = null) ptr = tmp;

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

Другие советы

Да, cptr станет недействительным, если RealLoc перемещает блок.

Нет, нет сигнала. Вам придется проверить возвращаемое значение по сравнению с оригиналом ptr место нахождения.

Это немного поздно, но решение этой проблемы (которое никто не упомянул) не использовать указатели в выделенные блоки, которые необходимо выделить. Вместо этого используйте целочисленные смещения из базового указателя или (лучше) struct Тип и элементы элементов для решения определенных местоположений в выделенном объекте.

да.

Лучше всего сделать, это сравнить PTR до и после перераспределения и посмотреть, было ли это перемещено. Вы не должны назначать указатель на значение смещения, вместо этого вы должны хранить смещение, а затем индексировать оригинальный оператор с ним.

т.е.

Вместоvoid* newPtr = ptr + 10; *newPtr = something;

Использоватьint new = 10; ptr[new] = something;

Да, CPTR становится недействительным, если Realloc перемещает блок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top