0

如果我为一个vector预留了大量的内存,(后面会用数据填充),预留的内存可以被别人使用吗?

例如,

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 保留的内存应该是 0x28df0020 和 0x3ece3c20。如果我理解这个权利,那么保留的内存就不会受到影响。我对吗?那为什么我在释放后会修改堆块?我应该如何处理?谢谢。

4

1 回答 1

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与您的问题无关,但要回答您的问题:不,一旦您为向量保留了空间,其他人可能不会使用它。

于 2013-07-26T17:38:52.897 回答