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

时间:2015-08-29 15:26:10

标签: c++ pointers memory dynamic allocation

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

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

2 个答案:

答案 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;,这意味着任何事情都可能发生,包括随机崩溃或根本没有效果。尝试访问已删除的内存是这种未定义行为的典型示例。