2015-03-09 2 views
0

Заявлено, что нет C++-эквивалента функции C realloc, я нашел в другом вопросе, что такая вещь автоматически управляется std::vector, и мы должны использовать ее вместо этого. У меня все в порядке. Я предполагаю, что, поскольку нет другого способа перераспределения, std::vector просто позвонит мне realloc.Операция переопределения Realloc и glocal new/delete

Однако возникает вопрос: если я перекрывая new и delete операторов для управления из отслеживания использования памяти во всем мире, они не будут вызваны в случае кто-то называет старые функции C (malloc, calloc, realloc, free).

Как это сделать? Правильно ли, что std::vector заменяет realloc?

+1

Если вы используете C++, вам не следует разрабатывать случаи, когда кто-то неправильно использует ваш код с функциями C. –

+0

вопрос другой: является ли кто-то самой библиотекой std? И если это так, как я могу это решить? – nyarlathotep108

ответ

3

std::vector не называет realloc; он будет использовать свой распределитель для достижения чего-то подобного: выделения новой памяти, перемещения объектов в нее, а затем освобождения старой памяти. Распределитель по умолчанию использует operator new и operator delete, и поэтому будет использовать ваши замены, если вы их предоставите.

realloc было бы совершенно неправильным, если вектор содержит нетривиальные объекты; он копирует необработанные данные, а объекты C++ обычно должны быть скопированы или перемещены, вызвав их специальные функции.

Ничто в библиотеке C++ (кроме, возможно, реализации по умолчанию operator new и operator delete) вызовет функции распределения C непосредственно. Поскольку вы не должны называть их самостоятельно, вам нужно только беспокоиться о них, если вы используете библиотеку C.

+0

Если вы используете библиотеки C, которые вызывают функции семейства malloc, многие реализации позволяют либо перехватывать, либо заменять malloc своими собственными. Вы можете использовать этот механизм для отслеживания распределения памяти. И, как упоминалось выше, многие реализации C++ используют malloc и бесплатно, как стандартные реализации новых и удаленных. – doron

+0

Было бы неплохо, если версия 'realloc' возвращает false и ничего не делает, если запрос не увенчался успехом. –

+0

@NeilKirk: Насколько я понимаю, это вряд ли будет полезно для сегодняшних многопоточных распределителей. Даже если распределение старого и нового размера может быть удовлетворено из одного и того же диапазона кучи (конечно, не данного), все же маловероятно, что имеется достаточное количество памяти. – MSalters

Смежные вопросы