2010-12-21 2 views

ответ

8

Использование new означает, что вы должны помнить, чтобы delete [] ее; использование зависимых от компилятора массивов переменных размеров означает, что вы теряете переносимость.

Лучше использовать вектор.

#include <vector> 

class Graphic 
{ 
    std::vector<int> array; 
    Graphic(int size) 
    { 
     array.resize(size); 
     glGenTextures(size, &array[0]); 
    } 
} 

Языковые гарантии, что элементы вектора будут смежными в памяти, так что это безопасно делать &array[0] здесь.

+0

Я не был уверен, как использовать 'vector' с функцией' glGenTextures', но это имеет смысл. благодаря! –

+0

@ Джей: Пожалуйста. Вы можете перенаправить ответы, которые вам нравятся (подсказка подсказки;)). –

+0

@j_random_hacker У меня пока нет привилегий, но я смогу принять ответ в любой момент. –

1

Нет, память для temp_array выделяется в стеке. Когда функция заканчивается, эта память освобождается, и все, что вы оставите, - это свисающий указатель. Если вы хотите сохранить массив действительным до того момента, когда конструктор вернется, затем распределите его динамически с помощью нового. Пример:

array = new int[size] 

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

delete[] array 
+3

И, конечно, у вас проблемы с копией и назначением. Гораздо лучше использовать 'std: vector'. – sje397

+1

Лучше: используйте 'std :: vector', и деструктор автоматически создается для вас (наряду с ранним выходом из-за исключения и т. Д.). Кроме того, исходный код даже не компилируется, стандарт C++ требует, чтобы 'size' в' int temp_array [size]; 'должен быть константой времени компиляции. –

+0

@Jay: Вы все равно можете использовать 'vector'. Язык гарантирует, что его элементы будут смежными в памяти (по этой точной причине), поэтому вы можете взять адрес 1-го элемента и передать его в 'glGenTextures()'. –

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