dr_rk
dr_rk

Reputation: 4565

Pointers assigned inside an invoked function valid?

I want to understand whether in this piece of code, pointers stored in the vector by func() are valid when accessed from main_func(), and if so why?

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???
   }

}

Upvotes: 0

Views: 70

Answers (4)

Bogdan M.
Bogdan M.

Reputation: 1128

Why don't you use a vector of pair vector<pair<double,double>>

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

Upvotes: 1

Spook
Spook

Reputation: 25927

Let's get to basics. A pointer is simply four-byte integer value denoting address in memory in which some data exists. Dynamic memory allocation is application-global, so if you allocate memory anywhere in your program by new, new[] or malloc (or something like this), you can use this memory anywhere you like and OS guarantees, that it won't be moved anywhere (in terms of address, that you got from the memory allocation routine).

So let's get back to your program. You allocate some memory inside the function and store the addresses of pointers to that memory in the vector. When you exit that function, these pointers are still completely valid and you can use them as you wish.

Don't forget to free them, when you don't need them anymore!

Upvotes: 0

Marius Bancila
Marius Bancila

Reputation: 16328

Your vector does not store references, but pointers to objects on the heap. That object is an array of two doubles, and you just copy the values from your local variable. So everything is alright (except that you don't release the memory).

If you somewhere (store and) return references or pointers to function locals, those won't have any meaning outside the function.

Upvotes: 0

Sarien
Sarien

Reputation: 6982

They are valid because you created them with new and that means they have dynamic storage duration. You do however lack the corresponding delete and therefore have a memory leak.

Upvotes: 0

Related Questions