全局范围内的智能指针

Smart pointer in global scope

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

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

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

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

unique_ptr objects automatically delete the object they manage (using a deleter) as soon as they themselves are destroyed, or as soon as their value changes either by an assignment operation or by an explicit call to unique_ptr::reset.

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

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

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

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

#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

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