0

我有一个类,其中我已将列表数组声明为数据成员。

list <int> **listOfNodes;

我在类的构造函数中为指向列表的指针分配了空间,如下所示(这里的'v'是我想要的列表的编号,作为参数传递给构造函数。)

listOfNodes=new list<int>* [v];
for (int i = 0; i < v; ++i)
{
    list<int> temp;
    listOfNodes[i]=&temp;  //declaring a new list and making the list pointer point to it
}

现在我在函数中有以下代码,用于获取用户的输入并将其添加到相应的列表中。例如,如果用户输入2 5,我需要push_back 一个新的条目5 到索引为2 的列表中,即listOfNodes[2] 指向的列表。

int u,v;
cin>>u>>v;
(*(listOfNodes[u])).push_back(v);

但是,不知何故,我的代码在执行时崩溃了。有人可以指出我可能做错了什么。

4

2 回答 2

2
for (int i = 0; i < v; ++i)
{
    list<int> temp;
    listOfNodes[i]=&temp;  
} // <- each temp is destructed here.

您的temp列表会自动分配。这意味着一旦你走出循环范围,它们就会被破坏。现在你listOfNodes[i]指向一些被破坏的内存(可能它们指向同一个位置,因为编译器每次都在同一个地址分配 temp。虽然仍然无效。)。

你应该这样做

for (int i = 0; i < v; ++i)
{
    listOfNodes[i] = new list<int>;  
}

并且不要忘记delete动态分配的内存。您可能应该只使用列表的列表/向量或使用智能指针列表。

于 2013-05-05T10:24:57.837 回答
2

避免将 C++ 容器(list、vector、set...)与 C 容器(纯数组)混合。如果要保留多个列表,请使用向量:

std::vector<std::vector<std::list<int>>> nodes;

代替

std::list<int>** listOfNodes;

手动跟踪列表实例非常麻烦(正是您所经历的)。因此,让向量(或您认为合适的任何其他内容,std::array根据您的情况可能更合适)负责处理列表实例。

于 2013-05-05T10:38:38.387 回答