C++ C++;获取指向地址的指针有什么意义

C++ C++;获取指向地址的指针有什么意义,c++,C++,我有一个遗留代码: 2个问题, 首先,他们为什么要使用指向引用变量的指针: cData& acData = *(*CacheVectorIter); //WHAT IS IT ? 这会删除真实的对象还是仅仅是指向该对象的指针 delete &acData; 这是代码(已修改) m_cache是一个存储指针的容器,因此前一行将获取指针并解除其限制以将其分配给引用 cData& acData = data; 那条线是完全有效的,但不是这条线 cData&

我有一个遗留代码: 2个问题, 首先,他们为什么要使用指向引用变量的指针:

 cData& acData = *(*CacheVectorIter); //WHAT IS IT ? 
这会删除真实的对象还是仅仅是指向该对象的指针

delete &acData; 
这是代码(已修改)

m_cache是一个存储指针的容器,因此前一行将获取指针并解除其限制以将其分配给引用

cData& acData = data;
那条线是完全有效的,但不是这条线

cData& acData = &data;
现在也许是最令人震惊的部分

delete &acData; // DOES IT DELETE THE OBJECT OR THE POINTER?
即使我不同意这种语法,它也是正确的,因为引用是针对堆中的对象的,您可以删除它


记住引用不会调用析构函数

for循环的
表明
cData
是一个UDT;它有一个名为
Map
的成员变量,可以是
std::Map

因此
m_Cache
是一个容器。它包含某种类型的对象(我们无法从这段代码中分辨),但该对象可以应用
*
来生成类型为
cData
的对象。包含的对象可以是
cData*
类型,但也可以是某个智能指针或其他类

所以这句话:

cData& acData = *(*CacheVectorIter);
acData
绑定为对象的名称,该对象是通过将
*
应用于容器中的对象而生成的。(它不会将对象复制出容器或任何东西)。注意,括号是多余的

该行:

delete &acData;
将释放
cData
对象。如果
m_Cache
的元素实际上是指针,那么这与在其中一个指针上调用
delete
相同

此代码是可疑的,因为它将离开包含悬空指针的容器(这有导致未定义行为的风险);希望这是一个更大的代码块的一部分,它也清除了整个向量


如果您可以发布
m_Cache
是其对象的任何对象的类定义,那将非常有趣;以及
cData
的类定义。这样可以给出更精确的答案。

好的,首先让我们检查一下
*cachevectorier

*cachevectorier
的类型是
CacheVector
,它是获取当前项的一种方式(没有什么新的内容)

现在有了wierd的
*(CacheVector)
。基本上没有CacheVector对象,我只能猜测

我猜,
CacheVector
包含另一个对象的地址。使用
*(CacheVector)
可以访问另一个对象(可能是cData类型)

它给出:

*(*CacheVectorIter) = *(CurrentCacheVector) = cData

然后该对象被存储到一个参考变量
acData
。在C++中,可以将引用看作是不需要引用引用的指针。因此,删除acData实际上会调用对象的析构函数。

似乎
m_Cache
被声明为包含指针的容器,然后第一个解引用运算符用于迭代器,第二个用于解引用实际指针,
acData
是对该数据的引用。然后使用
acData
上运算符的地址将为您提供一个指向它引用的对象的指针,然后您可以删除该对象。他们只是创建一个对迭代器指向的数据的引用,这样他们就可以使用点语法,而不必到处使用指针解除限制
(*cachevectorier)->Map.begin()为什么?,您正在引用堆上的某个区域,可以将其删除。语法非常难看但有效。
记住引用不会调用析构函数这是什么意思?尽管异常
delete&acData
将调用析构函数。本地引用不保存数据,只保存对它的引用。考虑引用的一种常用方法是抽象指针语法。因此,如果在本地代码中使用引用,则不使用C++实例的RAII默认机制。删除&acData;当取消引用返回指针时,将调用析构函数,如果该内存存储在堆上,则它将首先调用~Class()方法,然后调用free(指针);没有“撤销推荐”这样的事情。“抽象指针语法”是思考引用的糟糕方式,依我看。
删除任何东西
调用析构函数,因为
delete
就是这样做的。(当然,除了不带析构函数的类型)。
&acData
会产生一个指针,此时点引用不再相关。我同意使用引用作为隐藏指针语法的好方法是错误的,但如果他不能理解代码,那么“提示”可能会帮助他。谢谢,但为什么不让迭代器访问cData*pacData,为什么要使用reference varibal?@user63898 reference更安全、更易于使用。但是,使用指针也会有同样的效果,因为在内部,引用是作为指针实现的。
delete &acData;
*(*CacheVectorIter) = *(CurrentCacheVector) = cData