Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当执行delete或delete[]时,计算机做什么?_C++_C++11_Dynamic Memory Allocation_Delete Operator - Fatal编程技术网

C++ 当执行delete或delete[]时,计算机做什么?

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

那里!我是C++新手,遇到了删除数组指针的问题。在搜索“如何正确删除指向数组的指针”之前,也有类似的问题。结论是,在使用
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
,我希望数组的三个值都被删除。但是,结果是一样的

  • delete pvalue
    是否告诉计算机此地址可以自由访问 在其他地方使用,并且实际上不会更改 pvalue持有吗
  • delete pvalue
    delete[]pvalue
    是否更改指针指向的值
  • delete pvalue
    delete[]pvalue
    之间有什么区别?看起来他们的行为是一样的
“delete pvalue”是否告诉计算机该地址可以在其他地方自由使用,并且实际上不会更改该地址 pvalue持有吗

“delete pvalue”或“delete[]pvalue”是否更改指针指向的值

它可以调用对象的析构函数

“delete pvalue”和“delete[]pvalue”之间有什么区别?看起来他们的行为是一样的

一个删除一个对象,另一个删除一组对象

  • “删除pvalue”是否告诉计算机该地址可以在其他地方自由使用,并且实际上不会更改该pvalue的地址 持有
对。就是这个

  • “delete pvalue”或“delete[]pvalue”是否更改指针指向的值
在您显示的非常简单的情况下,不会。通常,将调用指向值的析构函数。这可能会改变值,也可能不会改变值。最后(这很重要),没有一个有效的C++程序告诉你——一旦调用了代码>删除< /代码>,检查值是不确定的行为。(未定义的行为意味着任何事情都可能发生——包括“你错误地预期的事情”。)

  • “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