【问题标题】:Visual leak detector with std::shared_ptr带有 std::shared_ptr 的可视检漏仪
【发布时间】:2014-10-08 07:55:35
【问题描述】:

我对 shared_ptr 比较陌生。我正在使用可视泄漏检测器,并且在运行时结束时给我以下代码作为内存泄漏时出现错误:

std::shared_ptr<the_type>(new the_type(the_parameter))

我是否必须调用其他东西,例如删除器甚至 shared_ptr::reset() ,是视觉泄漏检测器告诉我错误泄漏还是在 shared_ptr 实际被删除之前运行?

谢谢。

注意:我使用 vld 2.2.3、VS2012、Windows 7/8

【问题讨论】:

  • 代码在哪里?在函数中?
  • 是的,在一个函数中。调用堆栈追溯到我在问题中发布的行。
  • 如果是整行(减去分号)并且the_type 的ctor 没有泄漏,则不会有任何泄漏。不过,更喜欢make_shared,它可能更有效(1 个分配而不是 2 个分配)。

标签: c++ c++11 memory-leaks shared-ptr visual-leak-detector


【解决方案1】:

按照您显示的方式构造共享指针没有任何问题。看起来检漏仪报告了假泄漏,或者您以错误的方式使用它。作为旁注考虑使用std::make_shared 而不是显式的new 和共享指针构造函数——它通常更高效、更安全。

【讨论】:

  • 一般情况下 +1。我也同意std::make_shared 是首选,但有一个警告:如果您可能在对象被销毁后很长时间内将std::weak_ptrs 保留在对象上,您可以通过 not 使用来节省内存std::make_shared.
【解决方案2】:

没有更多代码,很难说,但一个明显的可能性是你有一个循环。随处使用std::shared_ptr 迟早会导致问题;对于特定情况,它是一个有用的工具,但它并不能解决您的所有问题。

【讨论】:

  • 它在装饰器模式中用作对父级的引用。在析构函数中,我调用parent_shared_ptr.reset(),并在装饰器的最后创建级别调用reset()
  • 如果父级有一个指向装饰器的指针,而装饰器有一个指向父级的指针,并且两者都是std::shared_ptr,那么你有一个循环,一个泄漏。 (在通常的实现中,父级不知道它的装饰器。但肯定有它应该知道的情况。在这种情况下,您可能需要与std::shared_ptr 不同的解决方案。)
  • 谢谢,我将孩子中对父母的shared_ptr 引用更改为weak_ptr,我希望父母拥有一个孩子。它不再泄漏。谢谢大家!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2014-01-18
相关资源
最近更新 更多