Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выделение произвольного объема памяти с помощью new

590
11 августа 2008 года
Gigahard
223 / / 03.04.2006
В winapi часто встречаются случаи, когда структуры требуют для размещения данных больше памяти, чем их собственный размер по умолчанию. Т.е. объем выделенной под структуру памяти, определяется по ходу выполнения программы.
В примерах кода для выделения произвольного объема памяти под эти структуры, используется malloc с последующим приведением типов.
Как корректно выполнить то же самое но через new? И стоит ли?
1.9K
11 августа 2008 года
max_dark
256 / / 11.11.2005
Код:
#include <iostream>

using namespace std;

struct varmem {
    int size;
    int items[1];
};

int main() {
    int size=11;
    varmem *m=(varmem*)(new int[size]);
    m->size=sizeof(int)*size;
    for (int i=0; i<size-1; i++) {
        m->items=size-i;
    }
    for (i=0; i<size-1; i++) {
        cout<<m->items<<endl;
    }
    delete [] ((int*)m);
    return 0;
}
В приципе работает, но ИМХО это грязный хак и так делать не стоит
590
11 августа 2008 года
Gigahard
223 / / 03.04.2006
Хорошо.. Вы подтвердили мои соображения по "хаку"...
Меня больше всего волнует, какой объем памяти освобождается при удалении.
Не теряется ли информация о размере массива выделенного через new при двукратном преобразовании типов?
1.9K
11 августа 2008 года
max_dark
256 / / 11.11.2005
Еще вариант без преобразования типов
Код:
#include <iostream>

using namespace std;

struct varmem {
    int size;
    int items[1];
};

int main() {
    int size=11;
    int i;
    union{
        varmem* m;
        char*   a;
    };
    cout<<"sizeof(char*):"<<sizeof(char*)<<endl;
    cout<<"sizeof(varmem*):"<<sizeof(varmem*)<<endl;
    a=new char[size*sizeof(int)];
    m->size=sizeof(int)*size;
    cout<<"m->size="<<m->size<<endl;
    for (i=0; i<size-1; i++) {
        m->items=size-i;
    }
    cout<<"m->size="<<m->size<<endl;
    for (i=0; i<size-1; i++) {
        cout<<m->items<<endl;
    }
    delete [] a;
    return 0;
}
590
11 августа 2008 года
Gigahard
223 / / 03.04.2006
Тут даже как бы не ставится самоцелью выделение памяти с помощью new, через подвыверты. С радостью бы спокойно пользовал malloc... Только вот в литературе не рекомендуют использовать данное наследие Си... В случае с С++ объектами такой совет вполне понятен и оправдан. Но не кроется ли за ним что еще? К примеру, нет ли предпосылок к тому, что данная часть будет исключена из будущих стандартов С++?
1.9K
11 августа 2008 года
max_dark
256 / / 11.11.2005
Интересный вопрос. Я как то над этим не задумывался.
Что ж, пофантазируем :)
Допустим, из стандарта С++ изъяли malloc/free и все другие С функции
Что же мы получим?
Операционные системы с API на С, невооброзимое количество программ на С++ использущих данный API, которые будет необходимо переписать либо на С, либо с использованием различных трюков. Да и сами библиотеки С++ нужно будет переписывать, т.к. если посмотреть их исходный код, то можно увидеть, что они активно используют "не рекомендованые" функции.
Все это невозможно в обозримом будущем.
Поэтому я сделаю вывод, что изъятие функций С проходить не будет, а все рекомендации по "не использованию" это всего лишь попытка уберечь програмистов от ошибок при использовании данных функций
Всё это только моё ИМХО.
1.8K
12 августа 2008 года
_const_
229 / / 26.11.2003
 
Код:
void *ptr = ::operator new(numBytes);
590
12 августа 2008 года
Gigahard
223 / / 03.04.2006
_const_

А что это за форма такая оператора new? Она есть по стандарту или это предложение самостоятельно перегрузить данный оператор?
Просто если честно, то я такого нигде в литературе пока не встречал... Можно объяснить что это и как оно работает? И где еще инфы по данному вопросу покопать можно?
1.8K
12 августа 2008 года
_const_
229 / / 26.11.2003
Ничего перегружать не надо - это "функциональная" форма вызова оператора. По-моему, так можно вызвать любой оператор. Вполне стандартный подход. Встретить можно, например, в исходниках STL от 2005-й студии в методе std::allocator::alloc.
590
12 августа 2008 года
Gigahard
223 / / 03.04.2006
_const_
А Вы не подскажите, где по этому вопросу можно доки какие почитать? Просто исходники исходниками, но хотелось бы взглянуть на что нибудь типа справочника.
1.8K
13 августа 2008 года
_const_
229 / / 26.11.2003
Не знаю, видимо, в стандарте можно посмотреть.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог