2013-03-12 61 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'; 
     } 
    } 
} 
相关问题