删除指向的动态分配内存后使用指针时没有错误

No error when using pointer after deleting the dynamically allocated memory it points at

我正在学习 C++ 中的动态内存。我的问题是为什么在下面的代码中删除变量后我没有收到错误?

float* uf = new float(4.26);
delete uf;
cout << uf << '\n';
cout << *uf << '\n';

您不会在 编译时 收到错误,因为虽然编译器试图检测直接错误,但它不可能在任何给定时间知道天气或您的指针是否指向有效内存。

运行时可能不会报错,因为虽然记忆已经"freed",但它仍然是记忆。它只是不能保证是你的了。这就是未定义行为的问题:它是未定义的;你永远不知道问题会如何表现出来。

你的意思是因为即使它显然是错误的,它也能编译?

可以说,在这种情况下,如果编译器确实需要,它可以产生警告,但这是一种简化的、不切实际的情况。

考虑以下示例:

float* uf = new float(4.26);
delete uf;
if (random_condition_known_only_at_runtime()) {
    uf = new float(0.0);
}
cout << uf << '\n';
cout << *uf << '\n';

或:

float* uf = new float(4.26);
if (user_input == 'x') {
    delete uf;
}
cout << uf << '\n';
cout << *uf << '\n';

或者考虑并发;多个线程可以写入同一个指针。

重点是实际代码通常(直接或间接)很大程度上依赖于 I/O 操作或其他类似的外部状态,因此无法在编译时提前知道内存是否指向的将已被删除。


或者你的意思是因为程序没有崩溃?那是因为 C++ 标准没有规定崩溃。它指的是 "undefined behaviour",这意味着任何事情都可能发生,包括随机崩溃或根本没有效果。尝试访问已被删除的内存是此类未定义行为的典型示例。