2013-05-16 3 views
0

Я хочу понять, действительно ли в этой части кода указатели, хранящиеся в векторе, на func() действительны при обращении от main_func(), и если да, то почему?Указатели, назначенные внутри вызываемой функции, действительны?

void func(vector<double*>& avector) { 
    double a=0,b=0; 
    for (int i=0;i<10;i++) { 
     double *a = new double[2]; 
     avector.push_back(a); 
     avector[avector.size()-1][0] = a; 
     avector[avector.size()-1][1] = b; 
    } 
} 

void main_func(){ 

    vector<double*> v; 
    func(v); 
    for (int i=0;i<v.size();i++) 
    { 
    // access a 
    // References stored in vector valid??? 
    } 

} 
+0

ли вы имеете в виду «указатели хранятся» вместо «ссылки хранятся»? – PlasmaHH

+0

Сохранение указателей на первый элемент динамически распределенных массивов в векторе довольно странно. Вы уверены, что вам нужно это сделать? – juanchopanza

+0

Извините указатели, вопрос отредактирован соответствующим образом –

ответ

0

Давайте перейдем к основам. Указатель - это просто четырехбайтовое целочисленное значение, обозначающее адрес в памяти, в котором существуют некоторые данные. Динамическое распределение памяти является глобальным приложением, поэтому, если вы выделяете память в любом месте вашей программы на new, new[] или malloc (или что-то в этом роде), вы можете использовать эту память в любом месте, где хотите, и OS гарантирует, что она не будет перемещена нигде (с точки зрения адреса, который вы получили из процедуры распределения памяти).

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

Не забудьте освободить их, когда они вам больше не понадобятся!

0

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

+0

А, да, извините, вот что я имел в виду. :) Применил ваши изменения. – Sarien

0

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

Если вы где-то (хранилище и) возвращаете ссылки или указатели для работы локалей, у них не будет никакого значения вне функции.

1

Почему бы вам не использовать вектор пары vector<pair<double,double>>

http://www.cplusplus.com/reference/utility/pair/

+0

Havent сталкиваются с «парой» до того, какая библиотека является этой частью? –

+0

добавил ссылку на пару, это часть std –

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