我试图在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。 “ 如果需要进一步澄清,请发表评论。
答案 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的地址消毒剂,记忆消毒剂或未定义的行为消毒剂。