C++ 当执行delete或delete[]时,计算机做什么?
那里!我是C++新手,遇到了删除数组指针的问题。在搜索“如何正确删除指向数组的指针”之前,也有类似的问题。结论是,在使用C++ 当执行delete或delete[]时,计算机做什么?,c++,c++11,dynamic-memory-allocation,delete-operator,C++,C++11,Dynamic Memory Allocation,Delete Operator,那里!我是C++新手,遇到了删除数组指针的问题。在搜索“如何正确删除指向数组的指针”之前,也有类似的问题。结论是,在使用new和delete时保持恒定是一个好习惯。如果您使用new[]分配内存,则应遵循delete[] 我对这个答案不满意。当执行delete或delete[]时,计算机会做什么?所以,我试过这个 #include <iostream> using namespace std; int main() { int* pvalue = NULL; pval
new
和delete
时保持恒定是一个好习惯。如果您使用new[]
分配内存,则应遵循delete[]
我对这个答案不满意。当执行delete
或delete[]
时,计算机会做什么?所以,我试过这个
#include <iostream>
using namespace std;
int main()
{
int* pvalue = NULL;
pvalue = new int[3];
cout << "address of pvalue:" << pvalue << endl;
for (int i = 0; i < 3; ++i)
{
*(pvalue+i) = i+1;
}
for (int i = 0; i < 3; ++i)
{
cout << "Value of pvalue : " << *(pvalue+i) << endl;
}
delete pvalue;
cout << "address of pvalue:" << pvalue << endl;
for (int i = 0; i < 3; i++)
{
cout << "Value of pvalue : " << *(pvalue+i) << endl;
}
return 0;
}
该指针的地址不是我预期的NULL
,只删除了两个值。
如果我将delete pvalue
替换为delete[]pvalue
,我希望数组的三个值都被删除。但是,结果是一样的
是否告诉计算机此地址可以自由访问 在其他地方使用,并且实际上不会更改 pvalue持有吗李>delete pvalue
或delete pvalue
是否更改指针指向的值delete[]pvalue
和delete pvalue
之间有什么区别?看起来他们的行为是一样的delete[]pvalue
- “删除pvalue”是否告诉计算机该地址可以在其他地方自由使用,并且实际上不会更改该pvalue的地址 持有
- “delete pvalue”或“delete[]pvalue”是否更改指针指向的值
- “delete pvalue”和“delete[]pvalue”之间有什么区别?看起来他们的行为是一样的
区别在于
new
分配的内存必须通过delete
删除,而new[]
分配的内存必须通过delete[]
删除。对于某些实现,根本没有区别。对于其他人,在new[]
分配的内存上使用delete
将无法运行析构函数。对于其他人,您的程序可能会停止。结论是,使用“新建”和“删除”时保持镇定是一个好习惯——结论实际上是根本不使用原始的新建和删除。使用RAII。delete[]
对数组的各个项以及数组本身运行析构函数。由于这些元素都有琐碎的任务,delete
和delete[]
通常也会这样做。但前者是未定义的行为。在您的代码中,delete pvalue
具有未定义的行为,因为pvalue
是new[]
的结果。只需使用std::vector
,不要再担心new
和delete
。@iksemyonov:计算机可以做任何事情,当程序显示未定义的行为时。什么是和不是未定义的是由C++标准定义的,这只是一个C++问题。任何运行时都可以选择以任何方式处理内存管理。语言规范没有强加任何规则(除了满足要求的保证)。
address of pvalue:0x150e010
Value of pvalue : 1
Value of pvalue : 2
Value of pvalue : 3
address of pvalue:0x150e010
Value of pvalue : 0
Value of pvalue : 0
Value of pvalue : 3