【问题标题】:C++11 , leaking memoryC++11,内存泄漏
【发布时间】:2015-11-19 23:40:07
【问题描述】:

我有一个案例,Xcode 的仪器检测到了

std::vector<UserID_t> functions::getUserIds() const {
    static_assert(sizeof(int64) == sizeof(uint64_t), "size is not matched");
    auto object = AAAAA::BBBB::ValueObject<int64 *>(_hash->getValue((nByte)Key::USER_IDS));
    auto size = object.getSizes();
    std::vector<UserID_t> ret(*size);
    auto pVal = object.getDataCopy();
    for (int index = 0; index < *size; index++) {
        ret[index] = *pVal;
        ++pVal;
    }
    return ret;
}

该工具显示“ret”中的元素在返回后没有释放。 但我认为 int64 是一个标量变量,我不需要释放它们。 对吗?

我使用 Xcode 6.3.2

【问题讨论】:

  • object.getSizes() 返回指针的事实是可疑的。这个指针指向什么?指针的寿命是多少?与object.getDataCopy()类似的问题
  • 是的,object.getSizes() 返回一个指针。指针的时间线仅在此函数中。我找不到Similar questions with object.getDataCopy(),你能把它链接到主题吗,非常感谢
  • @KenjyNeo:你误解了关于getDataCopy 的评论,Igor 只是想说他对getDataCopy 有类似的问题,他问过getSizes。我建议您将您的帖子编辑为:删除auto并放置真实类型或显示所有typedef的声明和涉及的函数,即:什么是UserID_tKey::USER_IDSgetValue、@987654334 @、getSizesgetDataCopy?如果没有这些元素,回答者只能猜测您的问题。
  • 指针的生命周期是什么一目了然。问题是,pointee 的生命周期是多少? getSizes()getDataCopy() 是如何实现的?他们是否在堆上分配内存,并期望调用者释放它(注意你没有)?如果不是,那么谁分配内存,谁负责释放它?
  • @MatthieuM, @Igor Tandetnik:UserID_t 的类型是 uint64_t ,'getSizes' 是 const short *,`getDataCopy` 是模板值对象的深度复制函数。问题是 getDataCopy() 。我还没有通过 DEALLOCATE_ARRAY 发布数据副本。所以我找到了另一种解决方案,在这种情况下用 getDataAddress 替换 getDataCopy() 函数。非常感谢

标签: c++ xcode c++11 memory instruments


【解决方案1】:

函数名.getSizes();意味着它返回一个大小数组?

或者它只是一个糟糕的 API 名称。

size 的实际类型是什么?

更新:在 cmets 中发现罪魁祸首是 getDataCopy(),它制作了一个深拷贝,然后永远不会被释放。

【讨论】:

  • 大小的类型是const typename Helpers::ArrayLengthType&lt;Etype&gt;::type* getSizes(void) const;
  • 这可能是过度设计的 API,但如果真正的罪魁祸首不是 ret,它只是一个值类型的向量(我假设 UserId_t 是 uint64_t 的别名?),但实际上在这一行- auto pVal = object.getDataCopy(); 显然分配数据的副本但从不释放它。 pVal的类型是什么?
  • @burkes:UserID_t 的类型是 uint64_t,'getSizes' 是 const short *,`getDataCopy` 是 template 的值对象的深拷贝函数。问题是 getDataCopy() 。我还没有通过 DEALLOCATE_ARRAY 发布数据副本。所以我找到了另一种解决方案,在这种情况下用 getDataAddress 替换 getDataCopy() 函数。非常感谢
  • 我认为你应该接受 Aaryaman Sagar 的回答,他已经在不久前指出了这个问题。
【解决方案2】:

auto 与指针一起使用(假设它们是指针而不是带有重载* 运算符的类)会使事情变得混乱。我认为错误可能在于您在object.getDataCopy() 中创建“副本”,返回指向它的指针而不是在functions::getUserIds() 返回之前删除它

【讨论】:

  • 我试过 delete 或 free ,但它有新的警告
  • 它有什么警告?如果您使用new 运算符分配内存,您应该调用delete 来解除分配,如果您使用像malloc 这样的C API 分配内存,那么您应该调用free
  • delete 是 malloc() 分配的警告内存,free 从 malloc() 分配的内存开始偏移 12 个字节。所以我通过使用 getDataAddress() 更改了解决方案并避免使用 getDataCopy ,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2010-11-11
  • 2017-02-18
  • 1970-01-01
  • 2013-01-10
  • 2014-11-01
  • 2020-03-31
相关资源
最近更新 更多