填充一个指针向量
Filling up a vector of pointers
请原谅我的新手问题
我有:
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_ptr
或unique_ptr
,然后你不必担心内存管理,这可能是你想要避免动态分配的原因。
存储一个指针向量并不会给A
的结果实例的向量所有权。为了填充这样的结构,将涉及到动态分配。
(当然,在实际代码中,您可能应该创建vector<unique_ptr<T>>
或vector<shared_ptr<T>>
而不是vector<T*>
,但这是另一个主题)
这是唯一的方法,因为在第一个示例中,存储指针的对象在for循环的每次迭代时都会立即销毁,因为它超出了作用域。
相关文章:
- 修改函数中的指针(将另一个指针作为参数传递)
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 更改一个指针后更改乘法对象
- 从另一个指针指向函数的指针
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- C:试图将指针值复制到另一个指针中,得到可修改的左值错误
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 我不明白我的错误需要返回一个指针数组
- 使用 SFINAE 测试是否可以将一个指针类型static_cast到另一个指针类型
- 将指针分配给另一个指针时会发生什么情况?
- 如何保存指针地址,以便另一个指针可以继续处理它
- 为什么 std::span 是一个指针 + 大小而不是两个迭代器
- 类的成员应该是一个指针
- 隐式指针变量,在自动定义中具有另一个指针变量
- 利用双重链接列表中的下一个指针
- 你能把一个指针投射到数组中吗?