请帮助我了解C++中的删除运算符
Please help me to understand delete operator in C++?
我是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 谈到不可预测的行为,因为它确实是不可预测的:下次尝试分配动态内存时,有机会获得(部分)您最近解除分配的相同区域。这将导致您的程序在两个(或更多)位置使用相同的内存区域,同时假设只有一个访问它。结果会怎样?不可预测 - 取决于您的代码。
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 无效删除运算符语法
- C++:如果我重载新运算符,我是否也必须重载删除运算符?
- C++自定义删除运算符不能正常工作?
- 为什么我们甚至需要删除运算符?(我们不能只使用删除[]吗)
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 在这里使用删除运算符是否正确,我很困惑
- 删除运算符
- 使用空实现重写删除运算符
- C ++(为什么)确实移动构造函数删除运算符=
- 如何在 C++ 中使用删除运算符删除单个数据
- 如何通过带有指向基类的指针的删除运算符释放内存
- 删除运算符如何在我的代码中工作
- C++ - 定义自定义新建和删除运算符时make_shared
- 将删除运算符放置在何处以进行动态变量
- C++删除运算符而不"new"
- 如何使用删除 [] 运算符清除动态分配的内存?(无法使用常规删除语法清除)
- 为什么删除运算符在const上下文中使用
- c++是否需要在用户定义和类特定的删除运算符中处理nullptr
- C++ 在覆盖新运算符和删除运算符时不释放数据