如果我在c++中删除一个指针,会删除什么

What will get removed if i remove a pointer in c++

本文关键字:删除 一个 指针 什么 c++ 如果      更新时间:2023-10-16

如果删除指向对象的指针,将删除什么?只有指针还是指针指向的对象?例如:

假设我有一个具有变量的类

int *root

如果我在类的方法中执行以下操作

int *current = root;
delete current;

根是否也会被删除,或者只删除当前指针?

我认为您对delete的作用有一个误解:delete删除由以前分配给new:的指针指向的对象

int* p = new int; // Create a new int and save its address in p
delete p;         // Delete the int

请注意,这不会以任何方式删除p本身,而是仅删除p指向的对象!您仍然可以像使用普通变量一样使用p,例如重新分配它。

当您有指向一个指针对象的多个指针时,您只需要对其中一个指针调用delete。

int* root = new int;
int* current = root;
delete current;
std::cout << *root; // undefined behavior

删除行为如§5.3.5:所述

6如果delete表达式的操作数的值不是null指针值,delete表达式将调用析构函数(如果any)。在在数组的情况下,元素将按递减地址(即,按完成的相反顺序他们的建设者;见12.6.2)。

是的,根被删除,但根据编译器的不同,current仍然可以包含未存在变量的地址。所以你必须这样做以避免错误:

delete current;
current = 0;
int *pointer = new int;

在该语句之后,指针将指向(指针将包含地址)足以存储整数的内存块。内部发生的情况是,来自自由存储的某个区块将被分配分配状态。

当您执行时

delete pointer;

这些内存将返回到免费存储中,以满足未来的需求。但您的指针将包含相同的地址。当你再次执行删除时,它将导致未定义的行为,因为该块已经返回到空闲存储(这意味着你已经失去了通过该指针对该内存的控制)

所以,为了安全起见,通常在删除内存后将指针设置为0。

pointer = NULL;

在操作符delete的实现中,有一段代码可以检查指针是否为NULL,如果为NULL,则返回。所以,据说删除空指针没有害处。

我希望我已经涵盖了所有的基础知识。