typedef struct{
float x,y,z;
unsigned long color; // size = 32 bit
} MDL_VERTEX;
int main(){
const int nBlock=100;
void* verts=(void*)malloc(sizeof(MDL_VERTEX)*nBlock);
for(int i=0;i<nBlock;i++){
}
return 0;
}
освобождение памяти
Код:
вообще это фрагмент моего парсера файлов *.3ds
я его именил немного оставил лишь только, что относится к вопросу!
nBlock это вообще гибая величина, а не константа, это просто чтоб вас лишним не грузить =)
почему я использовал void* ?? а не сразу MDL_VERTEX ? потому что я буду обрабатывать не только вершины типо MDL_VERTEX но и:
struct{
float x,y,z;
float nx,ny,nz;
} VERTEX_NORMAL;
то есть вершины с нормалями, вообщем разный тип вершин поэтому использовал void*
но суть не в этом
суть в том что:
Код:
class CObject3D{
public:
void* verts;
unsigned short nVerts; // кол-во вершин
unsigned short nElement; // размер для одного элемента verts
// то есть nElement=sizeof(MDL_VERTEX), т. к.
// в этом примере используется MDL_VERTEX
//................ кучу еще других параметров (отрисовка и т д)
}
typedef struct{
float x,y,z;
unsigned long color; // size = 32 bit
} MDL_VERTEX;
int main(){
const int nBlock=100;
MDL_VERTEX* _v=(MDL_VERTEX*)malloc(sizeof(MDL_VERTEX)*nBlock);
for(int i=0;i<nBlock;i++){
pos+=4*fread(&_v,4,3,f); // 4 это sizeof(float)
// 3 - 3 вершины (x,y,z)
// то есть color оставляем не заполненым, заполняем сами
_v.color=0xff0000ff;
}
verts=_v;
return 0;
}
public:
void* verts;
unsigned short nVerts; // кол-во вершин
unsigned short nElement; // размер для одного элемента verts
// то есть nElement=sizeof(MDL_VERTEX), т. к.
// в этом примере используется MDL_VERTEX
//................ кучу еще других параметров (отрисовка и т д)
}
typedef struct{
float x,y,z;
unsigned long color; // size = 32 bit
} MDL_VERTEX;
int main(){
const int nBlock=100;
MDL_VERTEX* _v=(MDL_VERTEX*)malloc(sizeof(MDL_VERTEX)*nBlock);
for(int i=0;i<nBlock;i++){
pos+=4*fread(&_v,4,3,f); // 4 это sizeof(float)
// 3 - 3 вершины (x,y,z)
// то есть color оставляем не заполненым, заполняем сами
_v.color=0xff0000ff;
}
verts=_v;
return 0;
}
вот ОСНОВНОЙ ВОПРОС: скажите плз где у меня происходить нерациональный расход памяти??
мне это очень важно, так как объектов может быть 1000!
а вершин у них по 1000-10000 (каждая вершина = 24 байта примерно, в этом примере = 16 байт)
Цитата:
как освободить памить под verts
Ну так free(verts), когда больше не нужно
почему не использовать C++ нормальным образом?
new и delete???
Умные указатели решат многие проблемы с утечками памяти в C++.
Цитата: NSDaler
нормальным это каким??
new и delete???
new и delete???
как уже сказали выше - нормальным - это и умными указателями, и используя наследование. Например.
Цитата: NSDaler
почему я использовал void* ?? а не сразу MDL_VERTEX ? потому что я буду обрабатывать не только вершины типо MDL_VERTEX но и:
struct{
float x,y,z;
float nx,ny,nz;
} VERTEX_NORMAL;
то есть вершины с нормалями, вообщем разный тип вершин поэтому использовал void*
struct{
float x,y,z;
float nx,ny,nz;
} VERTEX_NORMAL;
то есть вершины с нормалями, вообщем разный тип вершин поэтому использовал void*
Вот и очевидная ошибка. Ты выделяешь память под MDL_VERTEX, а его размер меньше, чем VERTEX_NORMAL и в случае чего у тебя обязательно будут баги.
Безопаснее писать так:
Код:
#include <boost/scoped_array>
using namespace boost;
typedef struct
{
float x, y, z;
union // Благодаря union, размер твоего типа VERTEX будет гарантированно вмещать любой тип вершины.
{
unsigned long color;
struct
{
float nx, ny, nz;
} vertex_normal;
}; // Наш union означает либо color, либо структура с 3-мя float'ами.
} VERTEX;
class CObject3D {
public:
scoped_array<VERTEX> verts;
unsigned short nVerts; // кол-во вершин
enum { mdl_vertex, vertex_normal } element_type; // Содержит тип элементов в массиве - MDL_VERTEX или VERTEX_NORMAL
}
using namespace boost;
typedef struct
{
float x, y, z;
union // Благодаря union, размер твоего типа VERTEX будет гарантированно вмещать любой тип вершины.
{
unsigned long color;
struct
{
float nx, ny, nz;
} vertex_normal;
}; // Наш union означает либо color, либо структура с 3-мя float'ами.
} VERTEX;
class CObject3D {
public:
scoped_array<VERTEX> verts;
unsigned short nVerts; // кол-во вершин
enum { mdl_vertex, vertex_normal } element_type; // Содержит тип элементов в массиве - MDL_VERTEX или VERTEX_NORMAL
}
Вообще, я бы подумал об отображении файлов в память (тогда считывать из файла вообще ничего не придётся, и записывать тоже), а также о наследовании (базовый класс Vertex, который содержит float x, y, z и производные от него MDL_Vertex и Vertex_Normal).
А с самим выделением памяти всё нормально, по крайней мере в плане "рационального использования памяти". 10 тыс. объектов размером в пару десятков байт - это даже мегабайта нет. Можешь спокойно выделять 1 млн. объектов размером с 500 байт каждый - комп справится.
Оптимизация возможна, но это уже совсем профессиональный вопрос и нужно видеть всю программу, а не отрывок.
Цитата: evoz23
т.е. не грузит dll, почему может быть??и в чем проблема?? помогите, уже какой день сижу ночами, никак не пойму(((
очень похоже,что где-то память несколько раз удаляется... только где??никак не пойму.
1. Зачем в "чужую" тему лезть...
2. Почему бы не добавить к своему сообщению *.h и *.cpp файлы собственно, предварительно упаковав их в архив, а не выкладывая 300 строчек кода...
3. Если уж выкладываете код, то используйте соответсвующие теги
А просматривать это в таком виде вряд ли кто-то будет.