2011-06-06 55 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,而這些對象本身應該是值。

相關問題