0

请原谅我的菜鸟问题..

我有 :

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

如果我使用 avector<A>但不使用 a,那会起作用,vector<A*>因为我所做的只是更改 &a 处的值并将相同的指针 &a 推 3 次。

我怎样才能做到每次都创建一个新的 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 类实际上在内存中很大,因此有指针。

4

3 回答 3

4

您应该意识到第一种方法不好:

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

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

于 2013-04-16T17:05:02.643 回答
1

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

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

于 2013-04-16T17:06:29.137 回答
0

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

于 2013-04-16T17:06:02.200 回答