创建指向列表中对象的指针映射?

时间:2011-06-06 15:26:46

标签: c++ list pointers object map

在尝试修补旁边项目中的内存泄漏时,我完全把自己与指针和列表以及地图和内存混淆等等。

我想创建一个在整个程序生命周期中使用的对象列表。但我也希望使用地图通过其唯一ID快速访问该列表中的各个对象。我想我可以有一个指向列表中对象的指针映射,以减少内存大小。

这可能吗?

我一直在研究看起来像的测试代码:

list<cObject> mylist;
map<int, ciEntity*> mymap;

void main(void)
{
    int x = 0;
    class cObject *temp;

    for(x = 0; x < 10; x++)
    {
        temp = new cObject;
        temp->name = new char[25];
        strcpy(temp->name, "Test");
        temp->id=x;
        mylist.push_back(*temp);
        // now what with the map?
        delete temp;
    }

}  

我有其他想法太乱用地图声明了。我尝试使用iter浏览列表然后mymap [id] = iter或类似的变体。我没有运气,没有任何工作。我知道我的基本原理并不是他们在处理记忆方面应该做的事情。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:3)

我会改变这一点,并在列表和地图中使用类似std::shared_ptr<cObject>的内容。您可以为地图使用intstd::string作为键类型,然后使用值类型,使用std::shared_ptr<cObject>

所以你的代码看起来更像是:

using namespace std;

list<shared_ptr<cObject> > mylist;
map<int, shared_ptr<cObject> > mymap;

void main(void)
{
    int x = 0;

    for(x = 0; x < 10; x++)
    {
        std::shared_ptr<cObject> temp = shared_ptr(new cObject);
        temp->name = new char[25];
        strcpy(temp->name, "Test");
        temp->id=x;
        mylist.push_back(temp);

        // now what with the map?
        mymap[x] = temp;

        //no need to delete temp since it's a managed pointer-type
    }

}

如果由于某种原因你的编译器没有std::shared_ptr,你也可以从boost获得它。

这种方法的好处在于您的列表和地图现在指向同一个对象,因此如果更改列表中的对象,更改也将反映在地图中。此外,shared_ptr对象将通过引用计数来管理指针的生命周期,因此一旦没有对指针的引用,它将在指针上调用delete而无需担心清理从每个容器指出(并避免指针的所有权问题)。

答案 1 :(得分:0)

您不需要列表和地图。地图支持迭代的方式与列表的方式非常相似,因此您可以通过密钥快速访问地图中的值,并通过迭代缓慢访问。我也怀疑你为什么要用new创建东西 - char数组应该是std :: string,而对象本身应该是值。