[英]0xC0000005: access violation in C++
這是我的代碼:
class Base
{
public:
virtual void show() const = 0;
};
class Child : public Base
{
private:
static const int i = 1;
public:
virtual void show() const
{
cout << i;
}
};
map<int, const Base &> myMap{
{ 0, Child() },
{ 1, Child() },
};
Base & b = Child();
int main()
{
b.show();
myMap.at(0).show(); // This provokes the error
system("pause>NUL");
return 0;
}
如您所見,我正在嘗試使用global
(或static
)數據,這將調用一些virtual
函數。 當我測試Base & b = Child();
在main
: b.show();
, 一切順利。
但是,如果我使用上面的map
,我將收到一個錯誤:
0xC0000005: Access violatoin reading location 0x00000000
。
我試圖調試這個代碼,我發現當它到達myMap.at(0).show();
, 我懂了:
似乎虛函數表Unable to read
...
然后我嘗試使用指針:
map<int, Base *>
和{0, new Child()}
。
這有效。
所以似乎這個錯誤來自臨時引用。
但我不知道為什么b
有效。 b
也是臨時參考。
在我看來,這張map
包含很多b
。
為什么b
工作而map
不起作用?
你有一個臨時工具的地圖。 即使編譯,我也很驚訝
map<int, Base &> myMap{
{ 0, Child() },
{ 1, Child() },
};
刪除引用並切換到unique_ptr
std::map<int, std::unique_ptr<Base>> myMap;
你在這里再做同樣的事情
Base & b = Child();
MSVC允許影響臨時引用,這意味着Base & b = Child();
被接受並正確處理,即使它不是標准的C ++並被其他編譯器拒絕(並且可能被更高版本的MSVC拒絕)
但即使是MSVC也不接受stl容器的引用。
所以你應該使用map<int, Base>
(沒有ref,存儲對象的副本),或者map<int, Base *>
(存儲指向對象的指針)。 在后一種情況下, 您必須明確地處理對象的破壞。 您還可以使用智能指針 , unique_ptr
或shared_ptr
讓stl關心自動銷毀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.