char *asd = new char[5];
asd[10] = 'f';
为什么这段代码在运行 whit 调试时不会给我一个错误?它会在发布构建期间导致崩溃。
char *asd = new char[5];
asd[10] = 'f';
为什么这段代码在运行 whit 调试时不会给我一个错误?它会在发布构建期间导致崩溃。
因为未定义的行为并不意味着它必须崩溃。
这意味着任何事情都可能发生,包括看起来正常工作。
您可以使用 std::vector 代替常规数组,因为在 C++ 或 C 中的数组中没有边界检查,这是设计使然(但您必须使用 at 方法)。数组只是第一个内存地址的指针,您可以使用它进行迭代,但没有关于边界的运行时信息。一个很好的例子是字符串:出于这个原因,我们使用 \0 终止符。
关于调试:当您使用调试器运行 ac 程序时,仅在操作系统上运行该程序并不是 100% 相等的。线程就是一个很好的例子,例如,当您在 gdb 上运行时会有所不同。
可能在不同的机器或操作系统中它不会崩溃。例如,为了避免这种情况,您可以使用 valgrind 来查看代码。
通常,当您在调试下编译和运行时,会在分配的内存空间周围实施一些保护块,高级编译器可以检查它是否被覆盖,从而向您发出内存访问错误的信号。在发布时,没有这样的东西,这取决于编译器将您的字节放在哪里,您只需覆盖之后的内容,这可能就是一切。一些感兴趣的读物是:http ://scottmcpeak.com/memory-errors/和http://msdn.microsoft.com/en-us/library/faz3a37z%28v=vs.71%29.aspx
asd[10] 仅表示“asd 的地址 + sizeof(10 字节)” 根据分配给 asd 的内存位置,此内存地址可能无法供您的程序使用,从而导致未定义的行为: