Как обновить другие указатели, когда RealLoc перемещает блок памяти?
Вопрос
Ссылка 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 перемещает блок.