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

时间:2011-04-05 16:56:16

标签: 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

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

3 个答案:

答案 0 :(得分: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,因为它的成本,但我过去运气很好。

答案 1 :(得分:0)

int *c = new int(5);
delete c;
c = null;  //add this

答案 2 :(得分:0)

第三方工具可用:对于Visual C ++,有Purify(但它很昂贵),也许还有其他一些工具。 (Linux有Valgrind,但我认为它不适用于Windows。)除此之外,设计是你最好的朋友。 C ++不要求你使用那么多指针,并且应该将其用作你设计的一部分。