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

Ваш аккаунт

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

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

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

освобождение памяти

44K
05 сентября 2010 года
NSDaler
36 / / 14.06.2010
как освободить памить под verts:
Код:
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;
}


вот ОСНОВНОЙ ВОПРОС: скажите плз где у меня происходить нерациональный расход памяти??
мне это очень важно, так как объектов может быть 1000!
а вершин у них по 1000-10000 (каждая вершина = 24 байта примерно, в этом примере = 16 байт)
399
05 сентября 2010 года
KIV
432 / / 20.01.2009
Цитата:
как освободить памить под verts


Ну так free(verts), когда больше не нужно

1
05 сентября 2010 года
kot_
7.3K / / 20.01.2000
почему не использовать C++ нормальным образом?
44K
07 сентября 2010 года
NSDaler
36 / / 14.06.2010
нормальным это каким??
new и delete???
297
07 сентября 2010 года
koodeer
1.2K / / 02.05.2009
Умные указатели решат многие проблемы с утечками памяти в C++.
1
07 сентября 2010 года
kot_
7.3K / / 20.01.2000
Цитата: NSDaler
нормальным это каким??
new и delete???


как уже сказали выше - нормальным - это и умными указателями, и используя наследование. Например.

350
30 сентября 2010 года
cheburator
589 / / 01.06.2006
Цитата: NSDaler
почему я использовал void* ?? а не сразу MDL_VERTEX ? потому что я буду обрабатывать не только вершины типо MDL_VERTEX но и:
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
}


Вообще, я бы подумал об отображении файлов в память (тогда считывать из файла вообще ничего не придётся, и записывать тоже), а также о наследовании (базовый класс Vertex, который содержит float x, y, z и производные от него MDL_Vertex и Vertex_Normal).

А с самим выделением памяти всё нормально, по крайней мере в плане "рационального использования памяти". 10 тыс. объектов размером в пару десятков байт - это даже мегабайта нет. Можешь спокойно выделять 1 млн. объектов размером с 500 байт каждый - комп справится.
Оптимизация возможна, но это уже совсем профессиональный вопрос и нужно видеть всю программу, а не отрывок.
842
04 октября 2010 года
sigmov
301 / / 16.09.2008
Цитата: evoz23

т.е. не грузит dll, почему может быть??и в чем проблема?? помогите, уже какой день сижу ночами, никак не пойму(((

очень похоже,что где-то память несколько раз удаляется... только где??никак не пойму.



1. Зачем в "чужую" тему лезть...
2. Почему бы не добавить к своему сообщению *.h и *.cpp файлы собственно, предварительно упаковав их в архив, а не выкладывая 300 строчек кода...
3. Если уж выкладываете код, то используйте соответсвующие теги

А просматривать это в таком виде вряд ли кто-то будет.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог