簡體   English   中英

0xC0000005:C ++中的訪問沖突

[英]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(); mainb.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();

您不能保存對臨時對象的非const引用

MSVC允許影響臨時引用,這意味着Base & b = Child(); 被接受並正確處理,即使它不是標准的C ++並被其他編譯器拒絕(並且可能被更高版本的MSVC拒絕)

但即使是MSVC也不接受stl容器的引用。

所以你應該使用map<int, Base> (沒有ref,存儲對象的副本),或者map<int, Base *> (存儲指向對象的指針)。 在后一種情況下, 必須明確地處理對象的破壞。 您還可以使用智能指針unique_ptrshared_ptr讓stl關心自動銷毀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM