| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > realloc() или свой вариант? |
| Автор: andrew_121 25.3.2009, 10:45 | ||
| Доброго времени суток. Есть шаблонный объект, который является оберткой типа массива, со своим менеджментом памяти. В нем есть такой код отвечающий за выделения памяти.
Есть сомнение в правильности работы realloc(). Так как при хранении некоторых типов объектов, при вызове realloc() происходит глюк. Вопрос: На сколько правильно использование realloc() совместно с new? |
| Автор: Gradov 25.3.2009, 11:32 |
| Никогда не экспериментировал в использовании new совместно с malloc,realloc для работы с одним и тем же участком памяти. И мне кажется ничего хорошего из этого не выйдет! Либо malloc, realloc, либо new. |
| Автор: andrew_121 25.3.2009, 19:41 |
| Предложите свои варианты реализации сей функции. |
| Автор: baldina 25.3.2009, 20:11 | ||||||
здесь вызывается конструктор type()
здесь - нет. потому и глюк. но это в слабом предположении, что new/delete реализованы через malloc/free а вообще-то по стандарту куча и свободная память - не одно и то же и смешивать malloc и new нельзя
std::vector. особо пытливые могут написать для него свой allocator |
| Автор: zim22 25.3.2009, 20:18 |
| andrew_121, тут написано, что думает Страуструп по поводу мешанины С и С++ функций работы с памятью http://www.research.att.com/~bs/bs_faq2.html#realloc а здесь Hamrick предлагает свой вариант решения проблемы http://www.daniweb.com/forums/showthread.php?t=84974&highlight=realloc+vs+new |
| Автор: andrew_121 26.3.2009, 11:31 |
zim22, Спасибо! |
| Автор: sparn 28.3.2009, 18:18 | ||||||||
В Си++ есть такая конструкция:
По сути это всего лишь корректное конструирование объекта на уже выделенном участке памяти, выделенном любым аллокатором. Подобным образом можно вызвать любой конструктор в том числе и копирования, например:
Так что если вы используете malloc, realloc или другие менеджеры памяти и хотите корректного конструирования объектов то это то что вам нужно. Ну и соответственно вызывайте деструкторы.
Думаю стоит заметить что в данном случае все объекты будут инициализированы конструктором по умолчанию и следовательно будет нетривиально корректно перекопировать старые объекты в новый участок памяти путём вызова конструктора копирования. В общем, если задача копировать старые объекты не стоит то можно использовать и такую конструкцию. |