2011-06-06 94 views
0

在试图修补除其他事项外的内存泄漏方项目我完全糊涂了自己的指针和列表和地图以及内存等创建一个指向列表中的对象的指针映射?

我想创建对象在整个项目生命使用的列表。但我也想使用地图通过其唯一的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或类似的变体。我没有得到任何好运。我知道我的基本面并不是他们应该关注记忆的地方。任何帮助表示赞赏!

+0

请添加一些关于cObject和ciEntity类的更多信息以允许更好的答案... – 2011-06-06 15:33:57

回答

3

我会改变这一点,并在列表和地图中使用类似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,而不必担心清理每个容器的指针(和避免指针的所有权问题)。

+0

同意。任何尝试创建指向列表中的对象的指针都会实际指向该位置矢量中的特定项目。如果项目更改了向量中的位置,或者向量重新分配了其内部存储(如果它需要在push_back之后增长),则指针将变为无效。如果不想在地图中放置额外的副本,则只有在向量和地图中存储指针才是唯一选项。 – Sven 2011-06-06 15:38:27

+0

+1引入C++ 0x智能指针 – AJG85 2011-06-06 15:45:21

+0

我认为这可能工作。我现在有一些测试代码,它似乎以我需要的方式工作,但是当我通过代码查看值时,调试在VS2008中变得更加困难:)谢谢! – Dave 2011-06-06 17:03:15

0

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