Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> realloc() или свой вариант? Что предпочтительнее. 
:(
    Опции темы
andrew_121
Дата 25.3.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Доброго времени суток.
Есть шаблонный объект, который является оберткой типа массива, со своим менеджментом памяти.
В нем есть такой код отвечающий за выделения памяти.
Код

bool up_resize( luint32 len ) {
    luint32 new_cnt = EXPONENT_UP( _capacity, len );
    if ( new_cnt > _capacity ) {
        if ( _begin != NULL ) {
            _begin = (type*)realloc( _begin, sizeof(type)*new_cnt );
            if ( _begin == NULL ) {
                throw std::bad_alloc();
                _end = NULL;
                return false;
            }
        } else {
            _begin = new type[new_cnt+1];
            if ( _begin == NULL ) {
                throw std::bad_alloc();
                _end = NULL;
                return false;
            }
        }
        _capacity = new_cnt;
    }
    _end = _begin + len;
}

Есть сомнение в правильности работы realloc(). Так как при хранении некоторых типов объектов, при вызове realloc() происходит глюк.

Вопрос: На сколько правильно использование realloc() совместно с new?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Gradov
Дата 25.3.2009, 11:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 31.10.2006

Репутация: нет
Всего: 3



Никогда не экспериментировал в использовании new совместно с malloc,realloc для работы с одним и тем же участком памяти. И мне кажется ничего хорошего из этого не выйдет!  smile 

Либо mallocrealloc, либо new.

Это сообщение отредактировал(а) Gradov - 25.3.2009, 11:33
PM MAIL   Вверх
andrew_121
Дата 25.3.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Предложите свои варианты реализации сей функции.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
baldina
Дата 25.3.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата

_begin = new type[new_cnt+1];

здесь вызывается конструктор type()
Цитата

_begin = (type*)realloc( _begin, sizeof(type)*new_cnt );

здесь - нет. потому и глюк. но это в слабом предположении, что new/delete реализованы через malloc/free
а вообще-то по стандарту куча и свободная память - не одно и то же и смешивать malloc и new нельзя

Цитата

Предложите свои варианты 

std::vector. особо пытливые могут написать для него свой allocator smile 
PM MAIL   Вверх
zim22
Дата 25.3.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



andrew_121, тут написано, что думает Страуструп по поводу мешанины С и С++ функций работы с памятью
http://www.research.att.com/~bs/bs_faq2.html#realloc

а здесь Hamrick предлагает свой вариант решения проблемы
http://www.daniweb.com/forums/showthread.p...=realloc+vs+new


--------------------
PM MAIL   Вверх
andrew_121
Дата 26.3.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(baldina @  25.3.2009,  20:11 Найти цитируемый пост)
здесь вызывается конструктор type()

 smile Как я мог этого не заметить...?  smile 
zim22, Спасибо!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
sparn
Дата 28.3.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.5.2006

Репутация: нет
Всего: 1



В Си++ есть такая конструкция: 
Код

T *new (T *ptr) T;

По сути это всего лишь корректное конструирование объекта на уже выделенном участке памяти, выделенном любым аллокатором. Подобным образом можно вызвать любой конструктор в том числе и копирования, например:
Код

CDog *MyDog = new (ptr) CDog(ParentDog);

Так что если вы используете malloc, realloc или другие менеджеры памяти и хотите корректного конструирования объектов то это то что вам нужно. Ну и соответственно вызывайте деструкторы.

Цитата

Код

_begin = new type[new_cnt+1];


Думаю стоит заметить что в данном случае все объекты будут инициализированы конструктором по умолчанию и следовательно будет нетривиально корректно перекопировать старые объекты в новый участок памяти путём вызова конструктора копирования. В общем, если задача копировать старые объекты не стоит то можно использовать и такую конструкцию.

Это сообщение отредактировал(а) sparn - 28.3.2009, 18:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1059 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.