std :: map.clear()抛出了读取访问冲突

时间:2017-12-08 03:55:35

标签: c++ std access-violation stdmap

我试图在std :: map上调用clear()方法而不会得到“ 异常抛出:读访问违规._Pnode是0xDDDDDDDD。 ”。

//I have narrowed down the error to this group of code
#include "stdafx.h"
#include <map>
#include <iostream>

class Input
{
    std::map<int, bool> pressedKeys;
    std::map<int, bool> heldKeys;
    std::map<int, bool> releasedKeys;

public:
    void Update()
    {
        heldKeys.clear();
        pressedKeys.clear();
        releasedKeys.clear();
    }
};

class Window
{
private:
    Input * input;
    void Update()
    {
        input->Update();
    }
public:
    Window()
    {
        input = &Input();

        while (true)
        {
            this->Update();
        }
    }
};

int main()
{
    Window w = Window();
}

例外总是发生在“heldKeys.clear();” Visual Studio中的调试器将我带到一个名为“xtree”的页面。下面的代码是“xtree:”

中发生异常的代码
void _Erase(_Nodeptr _Rootnode)
    {   // free entire subtree, recursively
    for (_Nodeptr _Pnode = _Rootnode; !_Pnode->_Isnil; _Rootnode = _Pnode) //The error occurs here
        {   // free subtrees, then node
        _Erase(_Pnode->_Right);
        _Pnode = _Pnode->_Left;
        _Alnode& _Al = this->_Getal();
        _Alnode_traits::destroy(_Al, _STD addressof(_Rootnode->_Myval));
        _Node::_Freenode0(_Al, _Rootnode);
        }
    }

我希望没有例外。 我收到异常“ 抛出异常:读取访问冲突。 _Pnode是0xDDDDDDDD。 “ 如果需要进一步澄清,请发表评论。

1 个答案:

答案 0 :(得分:2)

您是否在编译器中打开了所有警告?真的,任何相当新近的高质量C ++编译器都应该抓住这一点。例如。转到http://rextester.com/l/cpp_online_compiler_clang并输入代码,删除stdafx.h标题,无论如何都不需要,您将看到:

source_file.cpp:31:17: error: taking the address of a temporary object of type 'Input' [-Waddress-of-temporary]
        input = &Input();
                ^~~~~~~~

(使用clang 3.8作为编译器。)

与Stack Overflow相比,这证明了一种更有效的方法来查找大量的普通编程错误。其他类别的错误可能涉及开启额外的分析通道或消毒剂,如clang的地址消毒剂,记忆消毒剂或未定义的行为消毒剂。