这应该是一个简单的问题,但对于我的生活,我无法在网上找到解决方案。
简单地说,创建一个对象并将其添加到指针列表对我来说不起作用 - 只要我尝试以不同的方法访问列表中的项目,它就会产生访问冲突
所以有两个问题:
1:这样做的最佳方式是什么?
2:随后,如果它没有使用指针列表,那么从列表中删除的最佳方法是什么?
int main( int argc, const char* argv[] )
{
std::list<testClass*> list;
addClass(list);
std::cout << list.front()->a; //item added to list now longer accessible
}
void addClass(std::list<testClass*> list)
{
testClass* c = new testClass();
c->a = 1; c->b = 2;
list.push_back(c); //item still accessible here
}
class testClass
{
public:
int a;
int b;
};
答案 0 :(得分:4)
你需要通过引用传递你的list
,你在这里传递值,所以它正在复制容器并处理该副本:
void addClass(std::list<testClass*> list)
如果你这样修改它应该可以按你的意愿工作:
void addClass(std::list<testClass*> &list)
答案 1 :(得分:0)
第一个宏观错误是addClass
shold采用std::list<testClass*> &
,以便它在main中包含的列表上运行,而不是在本地副本上运行。
之后,整个设计必须更加专注:
由于testClass
不是多态的(其中没有虚拟内容),动态分配它们有什么意义?将它们作为值直接包含在列表本身中可能会更容易,有一个std::list<testClass>
。
或者......如果你需要动态分配,你还需要考虑 deallocation ,否则你会泄漏内存:如果列表中有指针,它会破坏指针,而不是他们指向。
现在,让我们按照两个轨道进行:
您需要一种从给定值构造testClass
对象的方法。
class testClass
{
public:
testClass(int a_, int b_)
:a(a_), b(b_)
{}
int a;
int b;
};
现在你可以
void addClass(std::list<testClass>& list)
{
list.emplace_back(1,2);
}
和
int main()
{
std::list<testClass> list;
addClass(list);
std::cout << list.front().a;
}
注意一些*
如何消失!
使用new进行创建,但您必须注意删除。
一种方法是从列表中删除指向:}
中的main
...
for(auto p : list) delete p;
这将遍历列表并为每个指针调用delete,从而解除分配(并销毁)您使用new分配的对象。
注意:这不会使列表为空:列表仍然包含指针,它们只是指向无效地址。指针将由main
另一种方法是不使用普通指针,而是使用智能指针,在销毁内容时自行删除内容。
这需要std::list<std::unique_ptr<testClass> >
作为容器,以便您可以
void addClass(std::list<std::unique_ptr<testClass> >& list)
{
list.emplace_back(new testClass(1,2));
}
现在,当main
退出时,列表会被自己的元素(智能指针)破坏,而delete
分配的对象将new
。