全局范围内的智能指针

时间:2017-10-11 19:40:49

标签: c++ smart-pointers

我的智能指针位于我的cpp文件(全局变量)之上:

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

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

智能指针将在程序结束时作为所有其他对象销毁。因此,当调用析构函数时,指针将被删除。她得到了一个甚至没有关闭到一个真正的智能指针的例子,但它提出了这个想法:

#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

无论如何,使用全局智能指针使我望而却步。该程序已经完成,因此无论如何都会将内存释放到操作系统中。

答案 3 :(得分:-1)

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

  

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