2013-03-12 58 views
1

我使用一個mapmap插入一個指針到std ::地圖

std::map<int, std::map<DWORD,IDLL::CClass*>*> *MyMap 

我用下面的代碼插入到map

std::map<DWORD,IDLL::CClass*> *SecondMap; 
SecondMap= new std::map<DWORD,IDLL::CClass*>; 
DWORD i = 1; 
while (eteration on obj type IDLL::CClass) 
{ 
    SecondMap.insert(std::make_pair(i,&obj));   
}int j = 1;  


MyMap->insert(std::make_pair(1,&SecondMap)); 

後來在程序中,map已變空!

任何人都可以幫忙嗎?

+2

的原因是什麼*不*使用'的std ::地圖<整型,性病::地圖< DWORD,IDLL :: CClass>> MyMap'(沒有指針)? – ipc 2013-03-12 17:21:16

+0

@ipc,當值對象不允許複製? – Joe 2013-03-12 17:22:09

+0

我必須使用很多地圖,所以我選擇poniters來減少內存使用 – user2161341 2013-03-12 17:25:39

回答

2

擁有原始指針是一般不好的做法(除非你是在特殊情況下,比如,如果你正在建設一個自定義的高級數據結構,以及擁有原始指針在適當的RAII類邊界保護) 。

第一個選項應該是使用值語義;如果這對您的性能不利,那麼您可能需要使用智能指針,如shared_ptr(這有助於使代碼更簡單,使其異常安全,避免資源泄漏等)。

這是一個示例編譯代碼,這似乎在VS2010 SP1(VC10)工作:

#include <iostream>  // for std::cout 
#include <map>   // for std::map 
#include <memory>  // for std::shared_ptr and std::make_shared 
using namespace std; 

typedef unsigned int DWORD;  

struct MyClass 
{ 
    MyClass() : Data(0) {} 
    explicit MyClass(int data) : Data(data) {} 

    int Data; 
}; 

int main() 
{ 
    // 
    // Build some test maps 
    // 

    typedef map<DWORD, shared_ptr<MyClass>> InnerMap; 
    typedef map<int, shared_ptr<InnerMap>> OuterMap; 

    auto innerMap1 = make_shared<InnerMap>(); 
    (*innerMap1)[10] = make_shared<MyClass>(10); 
    (*innerMap1)[20] = make_shared<MyClass>(20); 

    OuterMap myMap; 

    myMap[30] = innerMap1; 


    // 
    // Testing code for maps access 
    // 

    const int keyOuter = 30; 
    auto itOuter = myMap.find(keyOuter); 
    if (itOuter != myMap.end()) 
    { 
     // Key present in outer map. 
     // Repeat find in inner map. 

     auto innerMapPtr = itOuter->second; 
     const DWORD keyInner = 20; 
     auto itInner = innerMapPtr->find(keyInner); 
     if (itInner != innerMapPtr->end()) 
     { 
      cout << itInner->second->Data << '\n'; 
     } 
    } 
} 
相關問題