Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除指针而不是变量_C++_Dynamic Memory Allocation - Fatal编程技术网

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
时,将为对象分配内存,并将其地址作为指针返回。该指针是一个唯一标识符,精确记录删除对象时需要释放的内存区域