在容器中创建和存储对象而不使用new?



假设我有一个类

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);
}

相关内容

  • 没有找到相关文章

最新更新