在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系统是否遇到同样的问题,或者这会导致段错误?
答案 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 ++不要求你使用那么多指针,并且应该将其用作你设计的一部分。