我無法理解爲什麼這不像我期望的那樣工作。這可能是我使用Visual Studio 2013,但嘿。插入自定義類以映射爲值時出錯
此代碼是我正在寫的遊戲引擎中的項目隨機化系統的一部分。
// the chance a rarity will have a given number of affixes
std::unordered_map<ItemRarities, ChanceSelector<int>> affixCountChances = {
std::pair<ItemRarities, ChanceSelector<int>>(ItemRarities::Cracked,
{ ChanceSelector<int>(
{ ChancePair(int, 100, 0) }) }),
std::pair<ItemRarities, ChanceSelector<int>>(ItemRarities::Normal,
{ ChanceSelector<int>(
{ ChancePair(int, 80, 0),
ChancePair(int, 20, 1) }) }),
// snip for conciseness (there are 3 more)
};
這是ChanceSelector類:
using Percentage = int;
#define ChancePair(T, p, v) std::pair<Percentage, T>(p, v)
template <class T>
class ChanceSelector
{
private:
std::unordered_map<T, Percentage> _stuff;
public:
ChanceSelector()
{
}
~ChanceSelector()
{
if (_stuff.size() > 0)
_stuff.clear();
}
ChanceSelector(std::initializer_list<std::pair<Percentage, T>> list)
{
// snip for conciseness
}
T Choose()
{
// snip for conciseness
}
};
上面的代碼編譯好,但我有兩個問題:
- 爲什麼在STD使用ChanceSelector我不明白::對需要一個默認的構造函數。顯式地,它看起來像我用初始化列表調用構造函數。
- 當應用程序運行時,它崩潰,:
Unhandled exception at 0x01762fec in (my executable): 0xC0000005: Access violation reading location 0xfeeefeee.
2號消失,如果我只有在地圖一個項目,或者如果我改變affixCountChances到std::unordered_map<ItemRarities, ChanceSelector<int>*>
定義(並相應地調整休息)。錯誤轉儲我可以將這些代碼list
:
for (_Nodeptr _Pnext; _Pnode != this->_Myhead; _Pnode = _Pnext)
{
_Pnext = this->_Nextnode(_Pnode); // <-- this line
this->_Freenode(_Pnode);
}
進一步檢查發現在析構函數發生的錯誤。 _stuff
爲空:
~ChanceSelector()
{
if (_stuff.size() > 0)
_stuff.clear();
}
它合法地調用析構函數。項目正在從_stuff
中刪除,但我不明白爲什麼它會調用析構函數。在所有項目構建完成並且affixCountChances包含所有項目後發生崩潰。我認爲這意味着它會銷燬它創建的所有臨時對象,但我不明白爲什麼它會創建臨時對象。
編輯:
構造ChanceSelector的:
ChanceSelector(std::initializer_list<std::pair<Percentage, T>> list)
{
int total = 0;
int last = 100;
for (auto& item : list)
{
last = item.first;
total += item.first;
_stuff[item.second] = total;
}
// total must equal 100 so that Choose always picks something
assert(total == 100);
}
我還沒有讀完它,但聽起來非常像你有一個錯誤的移動或複製構造函數。還要注意保留的標識符,如_stuff。 – nwp
我已經剪掉了不相關的代碼,使它更小。 –