【问题标题】:Smart pointer in global scope全局范围内的智能指针
【发布时间】:2017-10-11 19:40:49
【问题描述】:

我的 cpp 文件顶部有这个智能指针(全局变量):

std::unique_ptr<DATA_READ> smartPT(new DATA_READ);

如果智能指针在全局范围内声明会发生什么?我知道函数中的智能指针在函数结束后会自动删除和释放内存,但是在多个函数中使用的全局范围智能指针呢?

【问题讨论】:

  • 全局智能指针将在程序结束时释放内存。很像一个非智能、非指针的全局变量。
  • 当应用程序退出时它会被破坏 - 更多细节请见this question
  • 它的析构函数在 main() 返回后被调用

标签: c++ smart-pointers


【解决方案1】:

它会在程序终止时释放分配的内存。但是,将智能指针作为全局变量并不是一个好主意。

【讨论】:

    【解决方案2】:

    内存将在程序的整个生命周期中保持分配状态,除非采取特定措施来释放内存。本质上,就好像智能指针的范围是函数'main()'的范围。这里来自cplusplus.com

    unique_ptr 对象会在它们自己被销毁时自动删除它们管理的对象(使用删除器),或者一旦它们的值通过赋值操作或显式调用 unique_ptr::reset 发生更改。

    【讨论】:

      【解决方案3】:

      由于这是一个具有静态持续时间的变量,因此将在加载此代码时分配内存,通常在应用程序启动时分配内存,并在应用程序完成时释放。 如果你在函数中使用它,它通常应该被分配,除非它在另一个函数中被重置。

      考虑到动态加载的库,显然会有一些后果。

      【讨论】:

      • 在哪里被告知它是一个静态变量?
      • 对不起,你是对的,我的回答不准确。该变量不是静态的,但它确实具有静态持续时间。
      【解决方案4】:

      智能指针将在程序结束时像所有其他对象一样被销毁。因此,当调用析构函数时,指针将被删除。她你会得到一个示例,它甚至不接近真正的智能指针,但它给出了这个想法:

      #include <iostream>
      using namespace std;
      
      template <typename T>
      struct example {
          T* p_;
          example(T* p): p_{p} {
              cout << "example(T* p)\n";
          }
          ~example() {
              cout << "~example()\n";
              delete p_;
          }
      };
      
      int main() {
          cout << "start main\n";
          example<int> p{new int};
          cout << "end main\n";
          return 0;
      }
      

      在这里试试:https://ideone.com/rOtQY9

      无论如何,全局智能指针的使用让我望而却步。该程序已完成,因此无论如何都会将内存释放给操作系统。好消息是在构建过程中获得的任何资源也将被确定释放(例如,可以正确关闭文件,或者可以刷新比特流缓冲区)。

      【讨论】:

      • 所以只有在操作系统没有虚拟内存管理系统的情况下才需要智能指针。
      • @Tom 不,虚拟内存与智能指针无关。当您的指针需要在与分配位置不同的上下文中删除时,您可以使用智能指针。如果它是unique_ptr&lt;&gt;,则只有一个所有者,您可以传递所有权而不必担心谁负责删除它(唯一的所有者将删除指针)。如果它是shared_ptr&lt;&gt;,许多对象可以共享内存,但在完成后会记录下来。当你是最后一个时,你删除指针。
      • 我知道,什么是智能指针。但是全局非智能指针的资源会在程序退出时被删除吗?
      • @Tom 不,不能保证它会发生。具体来说,在 Linux 和 Windows 下,您确信您的程序分配的任何内存都将被释放,但它在 C++ 权限之外。全局非智能指针可能指向的对象的析构函数不会被调用。
      猜你喜欢
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      相关资源
      最近更新 更多