我有这个遗留代码: 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?
}
}
答案 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会真正调用对象的析构函数。