捕获所有无效的内存使用情况?

hel*_*922 2 c++ visual-c++

在Visual C++中,有时当资源被破坏时,它仍然可以通过指向该内存位置的任何东西"访问"(尽管非常不可靠/稳定).有没有办法让VC++返回异常/消息/等.哪会警告这种不稳定的使用?

例如:

int *c = new int(5);
delete c;
std::cout << *c << std::endl; // will execute, however the value is likely to be invalid
Run Code Online (Sandbox Code Playgroud)

在一个稍微相关的问题上,Linux系统是否遇到同样的问题,或者这会导致段错误?

Mar*_*k B 6

不要使用原始指针?使用shared_ptr/ unique_ptr或标准容器或boost的ptr包含器将真正减少您的new/ delete问题.还要重新审视您的设计,并尝试尽可能减少对象之间指针的蜘蛛网.尽可能使用weak_ptr.

但要更直接地回答你的问题:没有确定的方法.访问已删除的项目是未定义的行为,因此任何东西都是游戏.你最好的选择是MS调试malloc或使用说valgrind或其他内存检查器.堆和内存问题很难调试.

编辑:这是未定义的行为,因此Linux系统可能会再次出现或可能不会出现段错误.

EDIT2:根据http://msdn.microsoft.com/en-us/library/2f7sy2e9%28v=vs.80%29.aspx,您可以_DEBUG结合使用调试CRT库来定义调试堆函数.

我最近没有提到Purify,因为它的成本,但我过去运气很好.