Я хотел бы знать, могу ли я сделать это с помощью функции 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;
}
}
Код должен работать, но он не оптимален:
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
}
Нет причин для утечки памяти. Но это не совсем изобразительное искусство программирования. В такой ситуации я бы предпочел зарезервировать память один раз при запуске программы и удерживать ее до конца программы, чтобы избежать фрагментации памяти и снижения скорости.
Также в коде есть несколько «грузовых» строк:
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
}
Я представляю, что эта функция вызывается как часть потока GUI. Это означает, что мне не нужно беспокоиться о одновременном доступе нескольких потоков к этой функции.
Итак, давайте просто распределим память статически.
void Idle()
{
//PXCPointF32 is a struct
static PXCPointF32 uvmap[640*480];
//do some processing
//fill uvmap values
}
Этот код не может утечь память (потому что он не выделяет). Ваш код тоже в порядке, пока ничего в Idle()
запускает исключение.
Это не будет течь, если исключение не выдается до удаления и после нового. Использование умного указателя предотвратит это.