c ++ - 列表,指针和局部变量

时间:2013-06-10 12:04:39

标签: c++ list local

这应该是一个简单的问题,但对于我的生活,我无法在网上找到解决方案。

简单地说,创建一个对象并将其添加到指针列表对我来说不起作用 - 只要我尝试以不同的方法访问列表中的项目,它就会产生访问冲突

所以有两个问题:

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

2 个答案:

答案 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