0

我想了解在这段代码中,存储在向量 by 中的指针在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

4 回答 4

1

你为什么不使用一对向量vector<pair<double,double>>

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

于 2013-05-16T10:10:37.343 回答
0

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

于 2013-05-16T10:04:25.393 回答
0

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

如果您在某个地方(存储和)返回对函数局部变量的引用或指针,那么它们在函数之外将没有任何意义。

于 2013-05-16T10:05:59.227 回答
0

让我们来了解一下基础知识。指针只是一个四字节整数值,表示内存中存在某些数据的地址。动态内存分配是应用程序全局的,所以如果你在程序中的任何地方分配内存newnew[]或者malloc(或类似的东西),你可以在任何你喜欢的地方使用这个内存并且操作系统保证它不会被移动到任何地方(在地址,你从内存分配例程中得到的)。

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

当您不再需要它们时,不要忘记释放它们!

于 2013-05-16T10:10:04.003 回答