填满指针的矢量

时间:2013-04-16 17:01:48

标签: c++ pointers vector

请原谅我的noobie问题..

我有:

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

A newA(i);
{
    return A(i);
}

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

vector<A*> list;

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

如果我使用vector<A>但不使用vector<A*>,那就有效,因为我所做的只是更改&amp; a的值并将同一指针按下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类在内存中实际上是巨大的,因此指针。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这是唯一的方法,就像在第一个例子中一样,存储指针的对象会在for循环的每次迭代中立即销毁,因为它超出范围。