2013-02-10 6 views
2

Вот класс, который в основном представляет собой массив чисел, на котором я хочу выполнить некоторые операции.Динамически выделенный массив в классе

class MyClass { 
public: 
    MyClass() { //constructor 
     int * array = new int[n]; 
     for(int i = 0; i < n; i++) { 
      array[i] = i*i; 
     } 
    } //end constructor 
    int displayIthElement(int i) { 
     return array[i]; 
    } 
} 

Я получаю: ошибка, идентификатор «массив» не определен в функции displayIthElement. Это похоже на то, что массив массивов останавливается за пределами функции-конструктора, что не имеет смысла. В чем проблема?

спасибо.

+1

Это C++? Если это, вы должны добавить тег C++. – Flexo

+0

«Как будто массив массивов останавливается за пределами функции конструктора, что не имеет смысла». <- это то, что происходит, когда вы создаете локальную переменную. – imallett

+0

Как еще я могу создать массив, если он не в функции конструктора? Разве это не функция построения? – jazzybazz

ответ

5

Как будто массив массивов останавливается уже вне функции-конструктора, что не имеет смысла.

Собственно, это единственное поведение, которое имеет какой-то смысл ... так работает язык.

array - локальная переменная, объявленная и определенная в вашем конструкторе. Когда конструктор выходит из переменной указателя, он уничтожается, и вы пропускаете память, на которую он ссылается. Память, выделенная new или new []всегда требует соответствующего delete или delete [], прежде чем его референт выходит из сферы действия. Всегда.

array должен быть членом класса. Вы учитесь, поэтому неплохо понять, как работает динамическая обработка памяти, но в будущем предпочитают безопасный контейнер (т. Е. std::unique_ptr, std::vector и т. Д.), Который обрабатывает выделение и освобождение для вас.

class foo { 
public: 
    foo() { 
    array = new int[length]; 
    for(int i = 0; i < length; i++) { 
     array[i] = i*i; 
    }  
    } 
private: 
    int *array; // when does this get deallocated? Look up RAII 
}; 
+0

"всегда получает соответствующее удаление"? Я знаю, что вы имеете в виду, но формулировка немного запутанна. «требует откорректирующего удаления» кажется менее двусмысленным. Но, если вы назначаете результат «новых» для интеллектуальных указателей, вам все равно не нужно удалять ... – Roddy

+0

@Roddy: Я не думаю, что это неоднозначно ... все, что выделяется с помощью 'new', получает' delete' в какой-то момент. Тот факт, что интеллектуальные указатели делают это для вас, не имеет значения; вы все равно должны понимать, как они работают. Мы, очевидно, имеем дело с новичком. Я думаю, что упоминание типов STL, которые обрабатывают память для вас, - это хорошо, но новички должны понимать, как работает управление памятью в первую очередь. –

+0

Возможно, я просто в педантическом настроении :-) Мы оба знаем, что имеется в виду, но «получает» просто смутил меня в первом чтении. Важно то, что 'new'ed memory не получает * автоматически *' deleted', когда его референт выходит за рамки. – Roddy

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