如果我在c++中删除一个指针,会删除什么
What will get removed if i remove a pointer in c++
如果删除指向对象的指针,将删除什么?只有指针还是指针指向的对象?例如:
假设我有一个具有变量的类
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,则返回。所以,据说删除空指针没有害处。
我希望我已经涵盖了所有的基础知识。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 从链接列表c++中删除一个项目
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 仅从无序集合中删除一个项目
- C++ 从数组中删除一个最大值和零
- 如果一个类继承了一个带有虚拟 dtor 的类,为什么要删除一个没有虚拟 dtor 的类是可以的
- 如何在不使用循环或迭代器的情况下检查所有列表元素并在满足条件时删除一个
- 我只想从文本文件中删除一个特定值或行
- C 对象阵列删除一个
- 在包含相同项目的向量中删除一个项目
- 当Ccarray_foreach中删除一个对象时,就会发生问题
- 从C++二进制搜索树中删除一个节点(类而非结构)
- C 从整数删除一个数字
- 如何从C 中的对象向量中删除一个项目
- 在单个链接列表中间删除一个节点,仅给定对该节点的访问
- 很难从我的二进制搜索树中删除一个节点
- 添加两个节点并在比较时删除一个节点
- C++-从单链循环列表中的任何索引中删除一个节点
- 如何从结构数组中删除一个数据行?(带索引)