【问题标题】:malloc'd memory overlaps object created by std::make_sharedmalloc 的内存与 std::make_shared 创建的对象重叠
【发布时间】:2013-04-18 01:48:40
【问题描述】:

malloc 的调用将返回一个指向内存块的指针,该内存块与make_shared 已分配的内存重叠。我正在构建一个 FUSE 客户端,malloc 调用在 FUSE 库中,但我不确定这是否相关。我无法在我的程序之外重现该错误,而且我不知道下一步该做什么。直到 shared_ptr 管理的对象中的指针被损坏然后被使用,Valgrind 才发现任何错误。

【问题讨论】:

  • 你试过在valgrind下运行它吗?如果malloc() 的内部数据结构损坏,这样的事情听起来是可能的。
  • 是的,直到指针损坏然后被使用才发现错误。
  • 您确定共享指针没有释放其对象的所有权吗?这将导致对象被删除,另一个malloc 调用可以重用该内存。
  • 对象被覆盖时实际上有2个shared_ptrs,一个在栈上,另一个在向量中。
  • 按可能性降序排列,以下是我的猜测:(1)您声称的内容是错误的,您误解了情况。 (2)您以某种方式让两个内存分配系统都通过一组正在使用的地狱般的库声明相同的内存,可能是因为它们引用了两个不同的地址空间。 (3) 您在编译器和运行时中发现了一个错误。 (4) 宇宙射线不断地在你的计算机中翻转比特以引起意想不到的行为。

标签: c++ c memory-management malloc fuse


【解决方案1】:

这个错误是用new 创建shared_ptr,然后将其类型转换为weak_ptr 并删除它的结果。我必须对它进行类型转换,因为我正在使用 C 库 (FUSE) 并将其传递一个指向 weak_ptr 的指针,并且它提供了一个 uint64_t 来存储句柄。然后库调用我的函数并将包含指针类型转换为uint64_t 的结构传递给它们。

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多