【问题标题】:What's a naked pointer?什么是裸指针?
【发布时间】:2012-03-07 03:43:22
【问题描述】:

观察Naked Pointers(见第一条回复),问题很简单:

什么是裸指针?

【问题讨论】:

  • 真正的指针,而不是智能指针。
  • @ildjarn,那么什么是智能指针? :)
  • @NickDandoulakis 查看 talnicolas 的评论
  • @kame:在meta.stackexchange.com/q/77962讨论该主题
  • @MuhammadSalman 嗯,-1 工具提示确实说“这个问题没有显示任何研究工作”,嗯......你的问题没有显示任何研究工作。

标签: c++ pointers terminology


【解决方案1】:

裸指针(原始指针,“哑”指针)是 C 风格的指针 T*。将此与 C++ 提供的“智能”指针(std::shared_ptr<T>std::weak_ptr<T>std::unique_ptr<T>)进行对比。

【讨论】:

    【解决方案2】:

    “裸指针”是“普通”指针,即标准和任何有关 C++ 的书都称为指针的东西。它是通常的“T *”(其中T 是指针指向的类型)。

    “裸”术语开始将它们与 smart 指针对立起来,这些指针在许多方面表现得像指针(通常它们重载运算符 *->,在某些情况下)案例[])。

    智能指针是“智能的”,因为它们指定并强制执行一些所有权语义,消除了裸指针的“愚蠢”:事实上,裸指针不指定/不知道它们是否拥有它们的对象指的是(例如,如果它必须在指针超出范围时被释放),即使有一些命名约定,如果知道某个指针拥有对象,如果指向,语言不会强制执行这一点,所以,如果指针超出范围并且没有人手动释放指向的对象(通常在引发异常时会发生这种情况)您有内存泄漏。

    相反,智能指针利用 C++ 类型系统的保证(复制构造函数、赋值运算符、保证调用析构函数……)来建立和强制执行某种所有权(通常:严格且不可转让,严格但可以转移到另一个智能指针,在多个智能指针之间共享)。

    ...话虽如此,在 StackOverflow 和 Internet 上有大量关于智能指针的讨论,我很确定您将能够找到关于智能指针以及为什么使用拥有的裸指针的更广泛的讨论在现代 C++ 程序中,对象通常是坏事TM

    【讨论】:

      【解决方案3】:

      这是一个简单的例子:

      #include <memory>
      
      struct X { int a,b,c; };
      
      int main()
      {
          std::shared_ptr<X> sp(new X);
          X* np = new X;
          delete np;
      }
      

      np 是指向 X 类型对象的指针 - 如果您已动态分配 (new / malloc) 该对象,则必须为 delete / free 它...简单的指针,如np 被称为“裸指针”

      sp 是一个包含指向托管资源的指针的对象,这意味着您可以像使用 np 一样使用它,但是当没有拥有该资源的 shared_ptr 对象时,该资源是释放,所以你不必delete它。 智能指针负责内存管理,因此您不必这样做;)

      【讨论】:

      • 所以一个裸指针是真正的裸指针(即必须强制删除),并且只有当它是通过 new 动态分配时。
      • @MuhammadSalman:是的,但有一个例外:如果您使用 a = new int[5]; 分配一个数组,您应该像这样删除它:delete[] a;
      • 您应该像分配对象一样释放对象。这意味着使用malloc/callocfreenewdeletenew []delete[]
      • 谢谢你,毕竟NP很容易掌握。我很困惑,因为您对我在上述问题中提到的帖子的回复中有一条关于 NP 的评论。
      【解决方案4】:

      智能指针是 C++ 中的首选方式,因为它们提供了更好的内存管理。智能指针具有额外信息(计算引用数量、当前所有权等)以及它们指向的对象的地址,因此名称智能指针和裸指针不包含此类额外信息,因此名称裸指针因此他们不会在不再使用该对象后删除该对象,因为他们没有相关信息来执行此操作。 希望对留存我们有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-04
        • 2011-05-19
        • 2014-05-25
        • 2013-03-07
        • 2013-05-05
        • 2011-01-19
        • 1970-01-01
        相关资源
        最近更新 更多