2012-04-24 3 views
1

Я хотел бы, чтобы убедиться, что это не неправильно: я инициализировать массив сC++ инициализация массива, хорошая практика

double* lower = input->getLowerBox(); 

где функция getLowerBox() возвращает некоторые двойной *. это правильно? Или shold я инициализировать этот путь ::

double* lower = new double[nbP]; 
for (int i=0;i<nbP;i++) 
    lower[i]=input->getLowerBox()[i]; 

или избежать нескольких вызовов getLowerBox,

double* lower = new double[nbP]; 
double* tmp = input->getLowerBox(); 
for (int i=0;i<nbP;i++) 
    lower[i]=tmp[i]; 
delete[] tmp; 
+5

Хорошая практика будет использовать вектор вместо массива. – chris

+5

Это зависит от того, что возвращает 'getLowerBox()' и права собственности на то, что он возвращает. Btw, вы назначаете отдельные элементы массива, не инициализируя массив в последних двух случаях. –

+0

«std :: vector» в общем случае или 'std :: array', возможно, – Kos

ответ

4

Два шага рецепт:

  1. Изменить Input::getLowerBox() вернуть std::vector<double> const&
  2. Используйте копию, если вы хотите изменить возвращаемое значение, и const ссылки вместо
0

Ну, это зависит от того, что вы хотите сделать. Вам нужен новый массив или нет.

Ваш первый фрагмент не создает новый массив, поэтому управление памятью более важно.

Например:

double* lower = input->getLowerBox(); 
delete[] lower; 

, возможно, делают input->getLowerBox() недействительным. Или что-то вроде:

double* lower = NULL; 
{ 
    Class input; 
    lower = input->getLowerBox(); 
} 
//... 

бы lower зависшего указателя, если input очищает содержимое массива в деструкторе.

Последние два фрагмента создают новые массивы. Это безопаснее IMO, но также использует дополнительную память.

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

+0

Правильность зависит от семантики собственности того, что 'getLowerBox()', в зависимости от того, что решения * могут * быть неверными. Просто неправильно сказать, что оба являются правильными. –

+0

@ Вы так утверждаете, что если принадлежность к массиву принадлежит классу, первый вариант неверен? –

0

Первый способ в порядке. Вы вернете указатель на двойной, который я предполагаю, связан с массивом (если нет, то, пожалуйста, исправьте меня). Делая это, вы указываете на первый элемент этого массива, а затем можете просто индексировать lower или использовать арифметику указателя для доступа к другим элементам.

EDIT: Не могли бы вы изложить определение getLowerBox(), чтобы было более ясно, что вы пытаетесь сделать?

0

У вас есть возможность изменить getLowerBox()? Если это так, я бы изменил его, чтобы он возвращал вектор.

В зависимости от реализации он может вернуть вам указатель, который вы можете иметь или указатель на внутреннюю статическую (плохую, но возможную), поэтому вам нужно знать, что она делает, и действовать соответственно, сохраняя указатель или снимая копию соответственно.

Если вы не имеете контроля над getLowerBox() и вы знаете размер массива он возвращает, это было бы разумно идея скопировать его в вектор

double* lower = input->getLowerBox(); 
vector<double> lowerV(lower, lower + N); 

(где N является размер array - BTW это просто из памяти, я его не скомпилировал.)

0

Я бы определенно пошел с первым по нескольким причинам. Он чище, он избегает ненужных вызовов/создания переменных и т. Д. Просто убедитесь, что указатель ввода используется, если вы используете «->»; иначе используйте «.».

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