2015-05-02 2 views
0

Я хотел бы знать, могу ли я сделать это с помощью функции 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

Это нормально, но мне не нравится ваша несогласованность: '0' /' NULL' (используйте 'nullptr'),' if (uvmap! = NULL) 'такое же, как' if (uvmap) '. Вторая версия предпочтительна, поскольку указатели неявно конвертируются в 'bool'. Вам также не нужно устанавливать 'uvmap' в' NULL' после освобождения памяти, так как она локальная. – LogicStuff

+0

Да, вы можете это сделать, но * why *? 'std :: vector uvmap (640 * 480);', затем используйте 'uvmap []' по мере необходимости. И так как это обратный вызов, я * сильно * советую вам попробовать-catch для 'const std :: exception &'. Вы не хотите, чтобы отказ распределения (или любая другая производная от std :: exception) возвращался к неизвестному коду. Подробнее о кодировании читайте здесь [RAII здесь] (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization). – WhozCraig

+0

Потому что в дальнейшем SDK, который я использую, имеет функцию, которая принимает в качестве аргумента указатель на PXCPointF32 и заполняет uvmap. Что я там делаю, если я использую вектор? Я просто передаю указатель на первый элемент вектора? – mariosbikos

ответ

1

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

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 
} 
+0

Если я использую unique_ptr, то после этого у меня есть функция, которая принимает в качестве аргумента указатель PXCPointF32. Так что я там делаю? Могу ли я его бросить? – mariosbikos

+0

@ Mario13 Вы можете просто передать ему управляемый указатель, используя 'my_function (uvmap.get());'. – Galik

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 
} 
+0

Я думаю, что вы забыли оператора 'new'. –

+0

@FabioTurati uups, thx. Обновлен код –

0

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

1

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

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

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

    //do some processing 
    //fill uvmap values 
} 

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

+0

Это может быть проблематично для системы с низкими ресурсами. Кроме того, если подобный подход используется в остальной части кода, он также может стать проблемой для обычной системы – SomeWittyUsername

Смежные вопросы