C++ 删除指针而不是变量
根据我的理解,当您在使用的堆上分配对象时C++ 删除指针而不是变量,c++,dynamic-memory-allocation,C++,Dynamic Memory Allocation,根据我的理解,当您在使用的堆上分配对象时 Object* dynamicobject = new Object(); 当我打电话删除我就去 delete dynamicobject 我很困惑,因为我删除了指向该对象实例的指针,但按照我的思路,实际上需要删除内存中的对象本身,这需要像这样取消对指针的引用 删除*动态对象 但这是不正确的。 如果要更改指针指向的对象,则需要取消引用该对象,我假设同样的操作也适用于删除,但似乎只有指针可以删除。运算符是并行的新建返回指向新分配内存的指针删除获取指向已
Object* dynamicobject = new Object();
当我打电话删除我就去
delete dynamicobject
我很困惑,因为我删除了指向该对象实例的指针,但按照我的思路,实际上需要删除内存中的对象本身,这需要像这样取消对指针的引用
删除*动态对象
但这是不正确的。
如果要更改指针指向的对象,则需要取消引用该对象,我假设同样的操作也适用于删除,但似乎只有指针可以删除。运算符是并行的<代码>新建返回指向新分配内存的指针<代码>删除获取指向已分配内存的指针并将其删除。换句话说,
delete(new…())
<>也许有助于考虑<代码>删除>代码>从根本上必须与内存一起工作,而不是与对象本身工作。因此,它不仅需要对象,还需要对象的内存位置。运算符是并行的<代码>新建返回指向新分配内存的指针<代码>删除获取指向已分配内存的指针并将其删除。换句话说,
delete(new…())
<>也许有助于考虑<代码>删除>代码>从根本上必须与内存一起工作,而不是与对象本身工作。因此,它不仅需要对象,还需要对象的内存位置。
删除动态对象代码>不删除指针动态对象
。而是删除dynamicobject
指向的对象
您不必(也不能)编写delete*dynamicobject代码>,大概是因为与您不必编写dynamicobject=&newobject代码>删除动态对象代码>不删除指针动态对象
。而是删除dynamicobject
指向的对象
您不必(也不能)编写delete*dynamicobject代码>,大概是因为与您不必编写dynamicobject=&newobject编码>如果您这样做
delete *dynamicobject;
给delete
运算符的值是动态内存位置中的值,而不是位置本身。delete
操作员需要知道动态内存在哪里,以便可以回收它
例如,假设您执行以下操作:
int *dynamic_int = new int;
*dynamic_int = 10;
如果你当时这样做了:
delete *dynamic_int;
delete
操作符将接收整数值10
。这并不提供回收存储该值的动态内存所需的信息。但如果你这样做了
delete dynamic_int;
delete
操作符接收该动态内存的地址,它可以回收该地址。如果您这样做
delete *dynamicobject;
给delete
运算符的值是动态内存位置中的值,而不是位置本身。delete
操作员需要知道动态内存在哪里,以便可以回收它
例如,假设您执行以下操作:
int *dynamic_int = new int;
*dynamic_int = 10;
如果你当时这样做了:
delete *dynamic_int;
delete
操作符将接收整数值10
。这并不提供回收存储该值的动态内存所需的信息。但如果你这样做了
delete dynamic_int;
delete
操作符接收该动态内存的地址,它可以回收该地址。您只处理指针,因为动态内存分配只是一个大的块链表。当您请求大小为n的块时,分配器将在链表中搜索满足请求的块。当分配器找到块时,它返回指向所述块的指针——即块中第一个字节的地址
释放内存只是将块返回到链表中,这样当您再次尝试分配内存时,该块就可以重用
分配器只需要知道第一个字节的地址和大小。这就是为什么它只处理指针。您只处理指针,因为动态内存分配只是一个大的块链表。当您请求大小为n的块时,分配器将在链表中搜索满足请求的块。当分配器找到块时,它返回指向所述块的指针——即块中第一个字节的地址
释放内存只是将块返回到链表中,这样当您再次尝试分配内存时,该块就可以重用
分配器只需要知道第一个字节的地址和大小。这就是为什么它只处理指针。我认为您正在考虑销毁对象。调用new
时,将为对象分配内存,并将其地址作为指针返回。该指针是一个唯一标识符,精确记录删除对象时需要释放的内存区域
因此,需要为delete
提供指向要解除分配的内存的指针
但这并没有杀死这个物体。通过运行析构函数终止对象,这就是指针被取消引用的地方
析构函数当然是~Object(){}
因此delete
将通过运行析构函数取消对指针的引用,以访问对象的实际内存。析构函数在解除引用的对象上运行后,对象占用的内存地址将释放回运行时系统
因此,delete
需要一个指针,该指针被解除引用以销毁对象本身,然后用于确定要释放的内存。我认为您正在考虑销毁对象。调用new
时,将为对象分配内存,并将其地址作为指针返回。该指针是一个唯一标识符,精确记录删除对象时需要释放的内存区域