2

私はmap内部を使用していmapます:

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は空になりました!

誰か助けてもらえますか?

4

1 に答える 1

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';
        }
    }
}
于 2013-03-12T17:57:12.390 に答える