【问题标题】:Create a map of pointers to objects in a list?创建指向列表中对象的指针映射?
【发布时间】:2011-09-09 09:42:54
【问题描述】:

在尝试修补辅助项目中的内存泄漏等问题时,我完全把自己与指针、列表、映射和内存等搞糊涂了。

我想创建一个对象列表以在整个程序生命周期中使用。但我还想使用地图通过其唯一 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 或类似的变体。我有零运气得到任何工作。我知道在处理记忆方面,我的基础不应该是他们应该达到的水平。任何帮助表示赞赏!

【问题讨论】:

  • 请添加更多关于 cObject 和 ciEntity 类的信息,以便获得更好的答案...

标签: c++ list pointers object map


【解决方案1】:

我会稍微改变一下,并在您的列表和地图中使用std::shared_ptr&lt;cObject&gt; 之类的东西。对于映射,您可以使用 intstd::string 作为键类型,然后对于值类型,使用 std::shared_ptr&lt;cObject&gt;

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

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,而无需担心从每个容器(并避免指针的所有权问题)。

【讨论】:

  • 同意。任何创建指向列表中对象的指针的尝试实际上都会指向该位置处向量中的特定项。如果项在向量中改变位置,或者如果向量重新分配其内部存储(如果它需要在 push_back 之后增长),则指针将变为无效。如果您不想在地图中放置额外的副本,那么在矢量和地图中都存储一个指针是唯一的选择。
  • 我认为这可能有效。我现在有一些测试代码,它似乎按照我需要的方式工作,但是当我单步执行代码查看值时,在 VS2008 中调试变得更加困难:) 谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多