如果我在c ++中删除指针,将删除什么

时间:2014-11-02 13:15:01

标签: c++ pointers

如果删除指向对象的指针,会删除什么?只有指针或指针指向的对象? 例如:

假设我有一个带变量的类

int *root

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

int *current = root;
delete current;

root也会被删除或只有指针当前吗?

4 个答案:

答案 0 :(得分:3)

我认为您对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,例如重新分配它。

答案 1 :(得分:1)

当你有多个指向指针的指针时,你只需要在其中一个上调用delete。

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

删除行为在§5.3.5中描述:

  

6如果delete-expression的操作数值不为null   指针值,delete-expression将调用析构函数(如果   any)对象或被删除数组的元素。在里面   在数组的情况下,元素将按顺序销毁   减少地址(即,完成的相反顺序)   他们的建设者;见12.6.2)。

答案 2 :(得分:0)

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

delete current;
current = 0;

答案 3 :(得分:0)

int *pointer = new int;

在此语句之后,指针将指向(指针将包含地址)到足以存储整数的内存块。内部发生的是来自免费商店的一些块将被分配分配状态。

执行时

delete pointer;

将内存返回到免费商店以满足未来需求。但是你的指针将包含相同的地址。当你再次执行delete时,它会导致未定义的行为,因为该块已经返回到free store(这意味着你已经通过这个指针失去了对该内存的控制权)

因此,为了安全起见,通常在删除该内存后将指针设置为0.

pointer = NULL;

在执行操作符删除时,有代码检查指针是否为NULL,如果是,则返回。因此,它说删除NULL指针没有坏处。

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