为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
Why do I have to call "delete" twice when I have each two pointers at same memory?
我使用new
将堆内存分配给'k'
的指针变量,并将其复制到另一个指针变量中'd'
。
在这种情况下,我认为这两个变量指向相同的内存,因此"delete"
只需要一个变量中的内存;无论'k'
或'd'
。然而,当我delete k
时,'k'
和'd'
指向记忆。
所以我做了delete d
,Abort trap 6 error
出现了。
这是我的测试代码。
int* k;
k = new int(5);
int* d = k;
cout<<"d's : "<<d<<endl;
cout<<"k's : "<<k<<endl;
delete d;
cout<<"d's : "<<d<<endl;
cout<<"k's : "<<k<<endl;
delete k;
cout<<"d's : "<<d<<endl;
cout<<"k's : "<<k<<endl;
结果是
D的 : 0x7fbb56c02ae0 k的 : 0x7fbb56c02ae0 d的 : 0x7fbb56c02ae0k的 : 0x7fbb56c02ae0
中止陷阱:6
我期望访问'k'
和'd'
在我做delete d
之后进行segment error
,因为我删除了内存!
我错过了什么,有人可以帮助我吗?
然而,当我做
delete k
时,k
和d
指向记忆。
在某个指针上调用operator delete
将要求操作系统释放与此指针关联的内存,但不会更改指针本身的值。k
和d
只是继续指向内存中的同一位置,该位置同时发布。
这就是为什么有时人们在delete
后设置指向nullptr
的指针。在您的情况下,这将使您免于未定义的行为:
delete d;
d = nullptr;
k = nullptr; // Both must be re-assigned
delete k; // Ok, delete on a nullptr is a no-op
当你delete
某件事时,你并没有破坏内存,你只是把它标记为未使用。(您也可以运行析构函数中包含的清理代码,但那是另一回事了。内存本身,即物理位和字节,像以前一样保留在原位。
因此,当您delete
指针时,指针在事后仍指向物理内存中的相同字节,但不允许再使用它们。如果你这样做,任何事情都是允许发生的。这甚至适用于指针本身:任何指向 d 内存delete
指针都不能再被触摸,它立即无效。
如果在指针delete
d 后确实使用了指针,则它可能看起来工作正常。或者你可能会崩溃。或者,您可以访问使用相同物理内存字节创建的其他内存对象。你根本不知道实际会发生什么。
因此,您最初的想法是正确的:只有两个指针中的一个需要delete
,事后不得触摸两个指针中的另一个:
int* k;
k = new int(5);
int* d = k;
cout<<"d's : "<<d<<endl;
cout<<"k's : "<<k<<endl;
delete d;
// cout<<"d's : "<<d<<endl; //Undefined behavior, the pointer is invalid now
// cout<<"k's : "<<k<<endl; //Undefined behavior, k is invalid as well
// delete k; //Undefined behavior, k is invalid
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- C++两个对象,其中包含指向同一数组不同部分的指针
- 比较两个 constexpr 指针不是 constexpr?
- 在两个.cpp文件之间定义全局类/结构指针
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 如何在单个链表中交换两个节点的位置,只修改指针
- 如何仅考虑 *指针中的前两个元素
- 如果将两个相同的指针作为输入传递,memcmp 会做什么?
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- C++如何同时删除位于两个向量中的 2 个指针?
- 如何将值添加到嵌套结构中,该结构在C++中有两个指针
- 比较两个指针时">="运算符的奇怪行为
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 有没有更好的方法来添加两个智能指针?
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 为什么 fdump-class-hierarchy 为虚函数提供了两个指针 int vtable
- 两个类别的两个类,有指向另一堂课的指针
- 错误 :"+" 无法添加两个指针