2012-07-01 65 views
0

這是一個刺痛點:\。這是我的映射聲明:指向向量指針的地圖的錯誤

std::map<std::string, std::shared_ptr<std::vector<std::shared_ptr<BaseEntity> > > > m_EntityByClassList; 

真的,它是如此長的唯一原因是因爲智能指針聲明,這是非常簡單,只是這樣的:

std::map<std::string, std::vector<BaseEntity *> *> m_EntityByClassList; 

還是痛苦的,雖然閱讀。這是我的問題。當我嘗試在地圖中插入一個對象到一個新的向量中時,我得到「訪問衝突試圖讀取」運行時錯誤。

的是產生這個錯誤是這樣的代碼塊,

for(;;) 
    { 
     file >> classname; 
     if(file.eof()) 
      break; 
     m_EntityList.push_back(m_factory.createInstance(classname)); 
     m_EntityList.back()->Initialize(); 
     m_EntityList.back()->GetParams(file); 
     m_EntityByNameList[m_EntityList.back()->GetName()] = m_EntityList.back(); 
     m_EntityByClassList[classname]->push_back(m_EntityList.back()); 
    } 

現在是的,有certaintly很多的代碼,我正在省略這裏,主要是因爲那裏有一個很好的35分或36的對象和文件進入這是在這裏,所以我只是要列出相關的事情。文件是一個std::ifstream一個打開的文件,類名是std::string,m_EntityList是std::vector<std::shared_ptr<BaseEntity> >(不應該的問題),m_EntityByNameList是地圖具有索引鍵入std::string和對象類型std::shared_ptr<BaseEntity>(也應該沒有關係),然後以上地圖所有上述最後一項的陳述與完整的結果完全一致。如果最後一行被省略,它就會編譯並且工作得很花哨。

所以這個問題與其餘的文件無關,只是試圖添加一個向量到地圖並添加對象。如果你覺得你還需要別的什麼,請問我會在這裏發佈。發佈一切將很容易4000-4500線。

Annnnyway,我從this得知的地圖是,使用帶有尚未存在的指令的[]運算符將爲您創建一個,並在該索引處創建一個默認構造對象。所以我從中得到的是,將在索引classname處創建一個std::shared_ptr<std::vector<std::shared_ptr<BaseEntity> > >,這意味着我應該能夠訪問該矢量,無論它是事先創建還是之前創建。那麼有沒有人有什麼線索是什麼?

+3

一些'typedef's可能會幫助你... –

+0

@Oli Charlesworth:是的,不是在開玩笑:P – FatalCatharsis

回答

1

在地圖上使用operator[]不存在的鍵確實會插入新的shared_ptr。然而,你沒有考慮到的是新的shared_ptr將是空的(即空指針),因此解引用它將導致未定義的行爲。一個新的矢量不會被創建 - 因爲你正在使用指向矢量的指針,所以你需要自己分配一個新的矢量。

如果您的地圖的值類型是向量本身而不是指向它的指針,則會按您的預期自動創建。

+0

UGHHH,我錯過這個的唯一原因是因爲聲明太長了。現在使用typedefs,明顯是什麼錯了。謝謝一堆。 – FatalCatharsis