在调用函数内分配的指针有效吗?

时间:2013-05-16 10:02:28

标签: c++ pointers

我想了解在这段代码中,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???
   }

}

4 个答案:

答案 0 :(得分:1)

为什么不使用对vector<pair<double,double>>

的向量

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

答案 1 :(得分:0)

它们是有效的,因为您使用new创建它们,这意味着它们具有动态存储持续时间。但是你没有相应的删除,因此有内存泄漏。

答案 2 :(得分:0)

您的向量不存储引用,而是指向堆上对象的指针。该对象是两个双精度数组,您只需复制局部变量中的值。所以一切都很好(除了你不释放内存)。

如果你某处(存储和)返回函数本地的引用或指针,那么这些函数在函数外部没有任何意义。

答案 3 :(得分:0)

让我们来看看基础知识。指针只是四字节整数值,表示存储器中存在某些数据的地址。动态内存分配是应用程序全局的,因此如果您通过newnew[]malloc(或类似内容)在程序中的任何位置分配内存,则可以在任何您喜欢的地方使用此内存和OS保证,它不会被移动到任何地方(就地址而言,你从内存分配例程中获得)。

让我们回到你的程序。您在函数内部分配一些内存,并在向量中存储指向该内存的指针的地址。退出该函数时,这些指针仍然完全有效,您可以根据需要使用它们。

当你不再需要它们时,别忘了释放它们!