我想了解在这段代码中,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 :(得分:1)
为什么不使用对vector<pair<double,double>>
答案 1 :(得分:0)
它们是有效的,因为您使用new创建它们,这意味着它们具有动态存储持续时间。但是你没有相应的删除,因此有内存泄漏。
答案 2 :(得分:0)
您的向量不存储引用,而是指向堆上对象的指针。该对象是两个双精度数组,您只需复制局部变量中的值。所以一切都很好(除了你不释放内存)。
如果你某处(存储和)返回函数本地的引用或指针,那么这些函数在函数外部没有任何意义。
答案 3 :(得分:0)
让我们来看看基础知识。指针只是四字节整数值,表示存储器中存在某些数据的地址。动态内存分配是应用程序全局的,因此如果您通过new
,new[]
或malloc
(或类似内容)在程序中的任何位置分配内存,则可以在任何您喜欢的地方使用此内存和OS保证,它不会被移动到任何地方(就地址而言,你从内存分配例程中获得)。
让我们回到你的程序。您在函数内部分配一些内存,并在向量中存储指向该内存的指针的地址。退出该函数时,这些指针仍然完全有效,您可以根据需要使用它们。
当你不再需要它们时,别忘了释放它们!