请帮助我了解C++中的删除运算符

Please help me to understand delete operator in C++?

本文关键字:删除 运算符 C++ 帮助 了解      更新时间:2023-10-16

我是C++新手,尝试过。今天我正在经历动态内存分配。根据以下链接:

http://msdn.microsoft.com/en-us/library/h6227113.aspx

"在对象上使用 delete 运算符会释放其内存。一个 删除对象后取消引用指针的程序可以 有不可预测的结果或崩溃。

但是在下面的示例中,即使在使用删除之后,当我尝试打印该位置的包含时,它也会打印正确的值?如何?

我真的很困惑....请指导我?谢谢。

     int main()
 {
  int max_Value = 12;
     int *arr = new int [max_Value];
     arr[4] = 9;
     cout<< "arr of four is having: "<<arr[4]<<endl;
     delete[]arr;
    int i = 0;
    for(i=0; i<12; i++)
         cout<< arr[i]<<endl;
 return 0;
 }

当你delete(或delete[])一个指针时,你基本上告诉底层系统你不会再使用这个内存块了。系统现在拥有该集团,并且可以使用它(例如:分配其他东西)。在您的情况下,删除后没有完成任何工作,因此释放的内存块仍然保持不变。不过你不能依赖它,这是一个特殊情况。您可以尝试进行其他new分配,用数据填充它并观察旧的 pointee 数据,您可能会观察到内存块受到其他写入操作的影响。

这是我的结果,YMMV 因为我们明确处理未定义的行为:

int main() {
    int max_Value = 12;
    int *arr = new int[max_Value];
    arr[4] = 9;
    cout << "arr of four is having: " << arr[4] << endl;
    delete[] arr;
    // print old data
    for (int i = 0; i < 12; i++)
        cout << arr[i] << " ";
    cout << endl;
    // another write (overwrite?) operation
    int *arr2 = new int[max_Value];
    for (int i = 0; i < 12; i++)
        arr2[i] = -1;
    // print again old data
    for (int i = 0; i < 12; i++)
        cout << arr[i] << " ";
    return 0;
}

输出

arr of four is having: 9
3619976 3615400 0 0 9 62374 3604676 3611152 0 0 0 0
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 

删除的数据由操作系统返回给您!

当你在C++中delete一个对象时,它的内存不会消失 - 它只是被标记为未使用。 就像您有时可以在从硬盘驱动器中删除文件后恢复文件的一部分或全部一样,将来对已删除对象地址的读取可能包含以前存在的数据的残留。 但是,切勿故意执行此操作,因为这种访问可能会导致段错误并使程序崩溃。

它不会崩溃,因为您在禁用运行时错误检查的情况下进行了编译。可以使用/RTC 编译开关启用它们。

MSDN 谈到不可预测的行为,因为它确实是不可预测的:下次尝试分配动态内存时,有机会获得(部分)您最近解除分配的相同区域。这将导致您的程序在两个(或更多)位置使用相同的内存区域,同时假设只有一个访问它。结果会怎样?不可预测 - 取决于您的代码。