#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;
}
Выделение произвольного объема памяти с помощью new
В примерах кода для выделения произвольного объема памяти под эти структуры, используется malloc с последующим приведением типов.
Как корректно выполнить то же самое но через new? И стоит ли?
Меня больше всего волнует, какой объем памяти освобождается при удалении.
Не теряется ли информация о размере массива выделенного через new при двукратном преобразовании типов?
Код:
#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;
}
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;
}
Тут даже как бы не ставится самоцелью выделение памяти с помощью new, через подвыверты. С радостью бы спокойно пользовал malloc... Только вот в литературе не рекомендуют использовать данное наследие Си... В случае с С++ объектами такой совет вполне понятен и оправдан. Но не кроется ли за ним что еще? К примеру, нет ли предпосылок к тому, что данная часть будет исключена из будущих стандартов С++?
Что ж, пофантазируем :)
Допустим, из стандарта С++ изъяли malloc/free и все другие С функции
Что же мы получим?
Операционные системы с API на С, невооброзимое количество программ на С++ использущих данный API, которые будет необходимо переписать либо на С, либо с использованием различных трюков. Да и сами библиотеки С++ нужно будет переписывать, т.к. если посмотреть их исходный код, то можно увидеть, что они активно используют "не рекомендованые" функции.
Все это невозможно в обозримом будущем.
Поэтому я сделаю вывод, что изъятие функций С проходить не будет, а все рекомендации по "не использованию" это всего лишь попытка уберечь програмистов от ошибок при использовании данных функций
Всё это только моё ИМХО.
Код:
void *ptr = ::operator new(numBytes);
А что это за форма такая оператора new? Она есть по стандарту или это предложение самостоятельно перегрузить данный оператор?
Просто если честно, то я такого нигде в литературе пока не встречал... Можно объяснить что это и как оно работает? И где еще инфы по данному вопросу покопать можно?
Ничего перегружать не надо - это "функциональная" форма вызова оператора. По-моему, так можно вызвать любой оператор. Вполне стандартный подход. Встретить можно, например, в исходниках STL от 2005-й студии в методе std::allocator::alloc.
А Вы не подскажите, где по этому вопросу можно доки какие почитать? Просто исходники исходниками, но хотелось бы взглянуть на что нибудь типа справочника.
Не знаю, видимо, в стандарте можно посмотреть.