如果我为一个向量保留了大量内存,(稍后会用数据填充),其他人可以使用保留的内存吗?
例如,
vector<double* > vD;
vD.reserve(30000000); // the number is less than the maximum size of a vector
... ...
for(int i=0; i< 1000000; i++)
{
double * pF = new double; // will be pushed back to the vector
... ...
vD.push_back(pF);
delete pF;
}
pF = NULL;
上面的代码只显示了这个想法。在实际代码中,double是一个包含指针的自定义对象。当我运行代码时,我被信息崩溃了:免费堆块3bab8在被释放后在3bacc处被修改。确切的内存地址(3bab8和3bacc)将会改变。当我检查我的矢量时:
for _First --- 0x28df0020
_Last 0x28df0870
_End 0x3ece3c20
根据我的理解,为vD保留的内存应该是btw 0x28df0020和0x3ece3c20。如果我理解这一点,那么保留的内存是不受影响的。我对吗?那为什么我在释放后修改了堆块?我该怎么处理呢?谢谢。
答案 0 :(得分:2)
您正在存储指向对象的指针,然后删除这些对象,从而使指针无效。解决方案是简单地存储对象,而不是指向对象的指针。
vector<double> vD;
...
double pF;
...
vD.push_back(pF);
对于必须使用指针(例如多态对象)的情况,请使用智能指针。
vector<unique_ptr<Base>> vD;
...
unique_ptr<Base> pF(new Derived);
...
vD.push_back(move(pF));
关于reserve
的查询与您的问题无关,但要回答您的问题:不,一旦您为您的向量预留空间,其他人可能不会使用它。