代码之家  ›  专栏  ›  技术社区  ›  Loki Astari

聪明的提示:或者谁拥有你的孩子?[关闭]

  •  104
  • Loki Astari  · 技术社区  · 16 年前

    C++是关于内存所有权的。
    又名“ 所有权语义

    动态分配内存块的所有者有责任释放该内存。所以问题就变成了谁拥有记忆。

    在C++的所有权中,A型原始指针被封装在一个好的(IMO)C++程序中,这是非常罕见的[难得的]看到原始指针的传递(因为原始指针没有推断的所有权,因此我们不能告诉谁拥有内存,因此没有仔细阅读文档,你就不能告诉谁负责。或所有权。

    相反,很少看到原始指针存储在类中,每个原始指针都存储在自己的智能指针包装器中。( N.B.: 如果您不拥有某个对象,则不应存储它,因为您不知道它何时会超出范围并被销毁。)

    所以问题是:

    • 人们遇到了什么类型的所有权语义?
    • 使用什么标准类来实现这些语义?
    • 你认为他们在什么情况下有用?

    让我们为每个答案保留1种语义所有权,这样就可以分别对其进行上下投票。

    总结:

    概念上的智能指针很简单,简单的实现也很容易。我见过许多尝试过的实现,但它们总是以某种方式被破坏,这对于临时使用和示例来说并不明显。因此,我建议始终使用库中经过良好测试的“智能指针”,而不是滚动自己的指针。自动指针或一个增强智能指针似乎可以满足我的所有需求。

    std::auto-ptr<t>:

    对象归个人所有。
    但是所有权的转移是允许的。

    用途:
    不等于
    这允许您定义显示所有权显式转移的接口。

    boost::作用域指针

    对象归个人所有。
    不允许所有权转让。

    用途:
    不等于
    用于显示明确的所有权。
    当显式重置时,析构函数或将销毁对象。

    boost::shared_ptr<t>(std::tr1::shared_ptr<t>)

    多重所有权。
    这是一个简单的引用计数指针。当引用计数达到零时,对象将被销毁。

    用途:
    不等于
    当对象可以有多个具有在编译时无法确定的生存期的欠函数时。

    增强:弱指针

    用于共享的指针<t>。
    在可能发生指针循环的情况下。

    用途:
    不等于
    用于在仅循环维护共享引用计数时停止循环以保留对象。

    11 回复  |  直到 16 年前
        1
  •  20
  •   Failed Scientist Kundan    8 年前

    shared_ptr

    weak_ptr

    auto_ptr

    Boost

    const

        2
  •  23
  •   paercebal    16 年前

        3
  •  10
  •   Tim Cooper    12 年前

        4
  •  2
  •   Loki Astari    16 年前

        5
  •  2
  •   Matt Cruikshank    16 年前

    std::tr1::shared_ptr<Blah>

        7
  •  1
  •   Pieter    16 年前

        8
  •  1
  •   Nemanja Trifunovic    16 年前

        9
  •  1
  •   Hernán    16 年前

    http://yasper.sourceforge.net/

    * small (contained in single header)
    * simple (nothing fancy in the code, easy to understand)
    * maximum compatibility (drop in replacement for dumb pointers)
    

        10
  •  1
  •   Daniel Earwicker    16 年前

    auto_ptr

    swap

        11
  •  0
  •   Loki Astari    16 年前

    推荐文章