我正在学习C ++中的动态内存。我的问题是为什么在删除以下代码中的变量之后我没有收到错误?
float* uf = new float(4.26);
delete uf;
cout << uf << '\n';
cout << *uf << '\n';
答案 0 :(得分:1)
你在编译时没有收到错误,因为当编译器试图发现直接错误时,它无法在任何给定时间知道天气与否你的指针指向有效的内存。
您可能不会在运行时中收到错误,因为即使内存已被释放&#34;,它仍然是内存。它不再保证不再属于你了。这是未定义行为的问题:它是未定义的;你永远不知道问题究竟会如何表现出来。
答案 1 :(得分:1)
你的意思是因为即使它明显错误也会编译?
可以说,在这种情况下,编译器可能会产生警告,如果它真的想要,但它是一个简化的,不切实际的情况。
考虑以下示例:
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 ++标准没有规定崩溃。它反而指的是&#34;未定义的行为&#34;,这意味着任何事情都可能发生,包括随机崩溃或根本没有效果。尝试访问已删除的内存是这种未定义行为的典型示例。