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

Create a map of pointers to objects in a list?

本文关键字:指针 映射 对象 列表 创建      更新时间:2023-10-16

在试图修补附带项目中的内存泄漏等问题时,我完全混淆了指针、列表、映射和内存等。

我想创建一个在整个程序生命周期中使用的对象列表。但我也想使用一个映射来快速访问列表中的各个对象,通过它们的唯一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或类似的变体。我什么事都干不了。我知道我的基本功在记忆力方面没有达到应有的水平。感谢您的帮助!

我会稍微修改一下,并在列表和地图中使用类似std::shared_ptr<cObject>的东西。对于映射,可以使用int或可能的std::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,而不必担心清理每个容器中的指针(同时避免指针的所有权问题)。

您不需要列表和映射。映射以与列表相同的方式支持迭代,因此您可以通过键快速访问映射中的值,也可以通过迭代缓慢地访问。我还怀疑为什么要使用new来创建东西——char数组可能应该是std::字符串,对象本身可能应该是值。