删除或删除[]时计算机会执行什么操作?

Hai*_*iyu -1 c++ dynamic-memory-allocation delete-operator c++11

那里!我是c ++的新手,遇到了删除指向数组的指针的问题.如果你搜索"如何正确删除指向数组的指针",之前有一个类似的问题.结论是,保持使用new和使用的习惯是一个好习惯delete.如果您使用new <data-type> []分配momery,delete[]应该遵循.

我对这个答案不满意.计算机在执行deletedelete[]执行时会做什么?所以,我试过这个.

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

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
Run Code Online (Sandbox Code Playgroud)

该指针的地址不是NULL我预期的,只删除了两个值.如果我替补delete pvaluedelete [] pvalue,我会认为阵列的所有三个值都将被删除.但是,结果是一样的.

  • 难道delete pvalue说,这个地址是免费到别处使用,实际上并不改变P值保存地址的计算机?
  • delete pvaluedelete [] pvalue更改指针指向的值?
  • delete pvalue和之间有什么区别delete [] pvalue?看起来他们表现得一样.

Mar*_*ica 5

  • "删除pvalue"是否告诉计算机该地址可以在其他地方免费使用并且实际上不会更改pvalue所持有的地址?

是.正是这样.

  • "删除pvalue"或"delete [] pvalue"是否会更改指针指向的值?

在你所展示的非常简单的情况下,没有.通常,将调用指向值的析构函数.这可能会也可能不会改变这些值.最后(这很重要),有效的C++程序无法告诉 - 一旦调用delete,检查值是未定义的行为.(未定义的行为意味着任何事情都可能发生 - 包括"你错误预期的事情".)

  • "删除pvalue"和"delete [] pvalue"之间有什么区别?看起来他们表现得一样.

不同之处在于new必须删除delete分配的内存,并且new[]必须删除分配的内存delete[].对于某些实现,根本没有区别.对于其他人来说,使用deleteon new[]will 分配的内存只是无法运行析构函数.对于其他人,您的计划可能会停止.