假设我有一个类
class A{
int value;
public:
A(int val) : value(val) {};
}
使用for loop
将实例指针存储在vector等集合中std::vector<A*> myCollection;
for (int i = 0; i < 10; ++i){
myCollection.push_back(&A(i));
}
现在,for循环将在相同的内存位置构造和析构一个对象,从而得到一个有10个指针指向相同地址的向量,对它们解引用将得到a ->value = 9。在没有动态分配的情况下,有没有办法解决这个问题?是的,我必须使用指针集合而不是引用集合。
如果对象需要在堆栈上,但由于某些API要求,您还需要指针向量,则只需创建对象的数组,然后存储指针。
size_t const sz = 3;
A arr[sz] {1, 2, 3};
std::vector<A*> v;
v.reserve(sz);
for (auto& a : arr) v.push_back(&a);
someFunc(v);
问题当前程序的A(i)
是prvalue因此不能使用&
运算符取它的地址。这意味着以下表达式在您的代码中无效:
//---------------------vvvvv----->invalid because A(i) is a prvalue
myCollection.push_back(&A(i));
除了std::vector<A*>
,您还可以使用std::vector<A>
,如下所示:
std::vector<A> myVector;
myVector.reserve(10);
//-------^^^^^^^---------------->to avoid reallocations when capacity is not enough
for (int i = 0; i < 10; ++i){
myVector.emplace_back(i);
//-----------^^^^^^^^^^^^------->use emplace_back to forward the argument i
}
std::vector<A*> myPtrVector;
myPtrVector.reserve(10);
for(auto&elem: myVector)
{
myPtrVector.push_back(&elem);
}