C ++获取指向地址指针的含义是什么

时间:2015-03-19 13:16:47

标签: c++

我有这个遗留代码: 2个问题, 首先他们为什么要这个指针指向引用var:

 cData& acData = *(*CacheVectorIter); //WHAT IS IT ? 

这会删除真实对象还是只删除指向对象的指针?

delete &acData; 

这是代码(已修改)

for (CacheVector::iterator CacheVectorIter = m_Cache.begin();
           CacheVectorIter != m_Cache.end();
           ++CacheVectorIter) {
          if (*CacheVectorIter != NULL) {
             cData& acData = *(*CacheVectorIter); //WHAT IS IT ? 

             for (ObjectTypeMap::iterator ObjectTypeMapIter = acData.Map.begin();
                  ObjectTypeMapIter != acData.Map.end();
                  ++ObjectTypeMapIter) {

                 delete (*ObjectTypeMapIter).second;

             }
              delete &acData; // DOES IT DELETE THE OBJECT OR THE POINTER?
          }
}

3 个答案:

答案 0 :(得分:0)

 cData& acData = *(*CacheVectorIter); //WHAT IS IT ?

m_cache是​​一个存储指针的容器,因此前一行将获取指针并对其进行derefence以将其分配给引用。

cData& acData = data;

该行完全有效但不是

cData& acData = &data;

现在可能是最令人震惊的部分

delete &acData; // DOES IT DELETE THE OBJECT OR THE POINTER?

即使我不同意这种语法,也是正确的,因为该引用是针对堆中的对象而您可以删除它。

记住引用不要调用析构函数!

答案 1 :(得分:0)

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

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

所以这一行:

cData& acData = *(*CacheVectorIter);

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

该行:

delete &acData;

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

这段代码很值得怀疑,因为它会让容器中包含一个悬空指针(冒着导致未定义行为的风险);希望它是一个更大的代码块的一部分,它也可以清除整个向量。

如果您可以发布任何m_Cache的对象的类定义,那么它会很有趣;以及cData的类定义。这样可以给出更准确的答案。

答案 2 :(得分:0)

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

*CacheVectorIter的类型为CacheVector,这是获取当前项目的方式(不是新内容)。

现在你有*(CacheVector)这是奇怪的。基本上没有CacheVector对象,我不能只做猜测。

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

它给出了:

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

然后将此对象存储到引用变量acData中。在C ++中,您可以将引用视为不需要取消引用的指针。所以删除acData会真正调用对象的析构函数。