Объявите указатель внутри функции, которая вызывается несколько раз

Я хотел бы знать, могу ли я сделать это с помощью функции Idle (), которая вызывается несколько раз в программе opengl. Это нормально или я получу утечку памяти?

void Idle()
{
//PXCPointF32 is a struct
PXCPointF32 *uvmap=0;

uvmap=new PXCPointF32[640*480];
if(uvmap!=NULL)
{
//do some processing
//fill uvmap values
}

if (uvmap)
{
delete[] uvmap;
uvmap=NULL;
}
}

0

Решение

Код должен работать, но он не оптимален:

void Idle()
{
//PXCPointF32 is a struct
PXCPointF32 *uvmap=0; // why initialize to 0 only to replace its value?

uvmap=new PXCPointF32[640*480];
if(uvmap!=NULL)
{
//do some processing
//fill uvmap values
}

if (uvmap) // no need to test for null before deleting
{
delete[] uvmap;
uvmap=NULL; // no point setting to NULL because its local
}
}

Вместо этого вы можете сделать:

void Idle()
{
// set it directly
PXCPointF32* uvmap = new PXCPointF32[640*480];

if(uvmap)
{
//do some processing
//fill uvmap values
}

delete[] uvmap; // don't bother checking for null (delete[] does that)
}

Вы могли бы также хотеть рассмотреть умный указатель, чтобы очистить память в случае исключения:

void Idle()
{
// set it directly
std::unique_ptr<PXCPointF32[]> uvmap(new PXCPointF32[640*480]);

if(uvmap)
{
//do some processing
//fill uvmap values
}

// no delete[] here
}
1

Другие решения

Нет причин для утечки памяти. Но это не совсем изобразительное искусство программирования. В такой ситуации я бы предпочел зарезервировать память один раз при запуске программы и удерживать ее до конца программы, чтобы избежать фрагментации памяти и снижения скорости.
Также в коде есть несколько «грузовых» строк:

void Idle()
{
//PXCPointF32 is a struct
PXCPointF32 *uvmap=new PXCPointF32[640*480];

if(uvmap==NULL)
{
// panic and return
}

//do some processing
//fill uvmap values

delete[] uvmap;
//    uvmap=NULL;  out of scope anyway
}
1

Я представляю, что эта функция вызывается как часть потока GUI. Это означает, что мне не нужно беспокоиться о одновременном доступе нескольких потоков к этой функции.

Итак, давайте просто распределим память статически.

void Idle()
{
//PXCPointF32 is a struct
static PXCPointF32 uvmap[640*480];

//do some processing
//fill uvmap values
}

Этот код не может утечь память (потому что он не выделяет). Ваш код тоже в порядке, пока ничего в Idle() запускает исключение.

1

Это не будет течь, если исключение не выдается до удаления и после нового. Использование умного указателя предотвратит это.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector