我有一个非常简单的C++代码在这里:(访问冲突)解除引用删除的指针总是会导致访问冲突?
char *s = new char[100];
strcpy(s, "HELLO");
delete [] s;
int n = strlen(s);
如果我按F5(启动调试,)这总是导致崩溃运行从Visual C++ 2008这个代码但是,在开始这个可执行文件在IDE之外,或者使用IDE的Ctrl + F5(无调试开始)不会导致任何崩溃。有什么区别?
我也想知道是否有可能稳定地重现访问已删除区域导致的访问冲突崩溃?在现实生活中这种崩溃是罕见的吗?
它产生未定义的行为,这意味着该程序可以做任何想做的事情。不过,它有点奇怪,它不会在调试器外面崩溃。究竟发生了什么?如果这是一个控制台程序,输出是什么? – 2010-05-24 10:36:01
照顾已删除的指针确实很痛苦。这就是为什么你应该使用'std :: vector'或者在这个特殊情况下'std :: string'而不是'new []'。你不应该使用'delete'。 – avakar 2010-05-24 10:55:28
代码示例是从实际应用程序中删减的。我正在重现一个很少发生的bug,可能只有当一个线程执行'delete'并且另一个执行取消引用时。所以我想要一种稳定重现这一点的方法。所以所有这些有用的答案都没有让我失望:) – Gant 2010-05-24 16:32:26