填充一个指针向量

Filling up a vector of pointers

本文关键字:一个 指针 向量 填充      更新时间:2023-10-16

请原谅我的新手问题

我有:

class A;
{
    public:
    A(int i) : m_i(i) {}
    int m_i;
}
A newA(i);
{
    return A(i);
}

我想填充下面的向量,但是使用一个循环,其中对象a是用函数(newA)创建的:

vector<A*> list;
for (int i=0 ; i<3; ++i) {  A a = newA(i);  list.push_back(&a); }

如果我使用vector<A>,但不使用vector<A*>,因为我所做的只是改变&a的值,并push 3次相同的指针&a。

如何做到每次都创建一个新的a,而不改变同一个指针的值?

我提出了以下方法,但我希望这不是唯一的方法,因为它包括动态分配。

A newA(i);
{
    return A(i);
}
vector<A*> list;
for (int i=0 ; i<3; ++i)
{
    A a = newA(i);
    list.push_back(new A(a));
}

请注意,类A实际上在内存中是巨大的,因此有了指针。

你应该意识到第一种方法是不好的:

 for (int i=0 ; i<3; ++i) {  A a = newA(i);  list.push_back(&a); }

你正在创建一个局部对象,然后存储指向它的指针。一旦你离开循环,对象将不再存在,你有未定义的行为。正如john所说,如果不使用动态分配,就没有明智的方法来做你想做的事情。正如Billy所指出的,而不是使用原始指针,你可以使用shared_ptrunique_ptr,然后你不必担心内存管理,这可能是你想要避免动态分配的原因。

存储一个指针向量并不会给A的结果实例的向量所有权。为了填充这样的结构,将涉及到动态分配。

(当然,在实际代码中,您可能应该创建vector<unique_ptr<T>>vector<shared_ptr<T>>而不是vector<T*>,但这是另一个主题)

这是唯一的方法,因为在第一个示例中,存储指针的对象在for循环的每次迭代时都会立即销毁,因为它超出了作用域。