请原谅我的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类在内存中实际上是巨大的,因此指针。
答案 0 :(得分:4)
你应该意识到第一种方法是坏的:
for (int i=0 ; i<3; ++i) { A a = newA(i); list.push_back(&a); }
您正在创建一个本地对象,然后存储指向它的指针。离开循环后,对象将不再存在,并且您有未定义的行为。正如约翰所说,如果不使用动态分配,没有明智的方法可以做你想做的事情。正如Billy指出的那样,您可以使用shared_ptr
或unique_ptr
而不是使用原始指针,然后您不必担心内存管理,这可能是您希望避免动态分配的原因。
答案 1 :(得分:1)
存储指针向量不会给出A
的结果实例的向量所有权。为了填充这样的结构,将涉及动态分配。
(当然,在实际代码中,您应该创建vector<unique_ptr<T>>
或vector<shared_ptr<T>>
而不是vector<T*>
,但这是另一个主题)
答案 2 :(得分:0)
这是唯一的方法,就像在第一个例子中一样,存储指针的对象会在for循环的每次迭代中立即销毁,因为它超出范围。