将引用推送到向量中,在函数退出后引用是否有效?

时间:2012-06-08 23:53:32

标签: c++ memory-management memory-leaks

我创建了一个指向double数组的指针向量。这些指针在函数(即InsertIntoVector)退出后是否有效?如果我稍后在GetVecElement中获取指针,指针是否仍然保证指向它们被分配的相同内存位置?

class A { 
   vector<double*> vec; 

   void insertIntoVector(double x, double y); 
   void GetVecElement(int i, double& x, double& y); 
}; 

A::insertIntoVector(double x, double y) { 
   double* xy = new double[2]; 
   xy[0] = x; xy[1] = y; 
   vec.push_back(xy);       
}

A::GetVecElement(int i, double& x, double& y)
{
    x = vec[i][0];       // will the reference to the double array still be valid? 
    y = vec[i][1];
}

2 个答案:

答案 0 :(得分:2)

那些不是引用!这些是指针 ...

  

如果我稍后在GetVecElement中获取指针,那么引用是否仍然保证指向它们被分配的相同内存位置?

您没有删除指针,std::vector不会为您执行此操作,因此指针仍然有效。除非您在delete的析构函数中手动A,否则它也将泄露。但为此,您还需要 copy-constructor assign-operator 来克隆vector的内容。

答案 1 :(得分:0)

使用GetVecElement函数通过引用参数获取的值是向量元素所指向的堆栈数组的值(您已在insertIntoVector()中分配的值。因为您没有在任何地方删除它们你的代码(或至少看起来如此)这些值仍然会持续存在,但基本上你所拥有的是内存泄漏,除非你有一些额外的代码清理了这个内存并且你没有上传到你的例子中。被删除或清除,指向的内存位置是向量的double *元素将持续存在,除非你主动实现一些代码来清理它(这将是一个好主意)。