使用智能指针作为全局变量
Using smart pointers as global variables
假设我有一个程序,我必须在其中使用全局变量(某些 class 类型)。
我希望能够使用智能指针,这样我就不用担心删除它了。
在某些文件 Common.hpp
文件中我有声明:
extern unique_ptr<CommandBuffer> globalCommandBuffer;
在我的 main.cpp 中:
#include "Common.hpp"
int main(int argc, char* argv[]) {
globalCommandBuffer(new CommandBuffer());
}
这会造成许多编译错误。很明显我做错了。
我的问题是:
- 对全局变量使用智能指针是一个好的设计选择吗?
- 如果是这样,正确的做法是什么?
- 哪个智能指针更好?
你想要:
globalCommandBuffer.reset(new CommandBuffer());
或者:
globalCommandBuffer = std::make_unique<CommandBuffer>();
全局变量很少是个好主意。
如果您想要全局(您可能不需要,但以防万一),只需创建一个全局即可。智能指针的全部意义在于管理所有权和生命周期。在全局的情况下,这些通常是微不足道的——您希望它们在其他任何事情发生之前就存在,并继续存在直到其他一切停止发生。
除非您需要与此不同的东西,否则只需将您的对象创建为全局对象,而不是指向动态分配对象的智能指针。
问题不在于全局变量,它是一些 smart_ptr,但问题是您在头文件中定义了一次,然后又在 main.cpp 中定义了它。双重定义肯定会有问题。
假设我有一个程序,我必须在其中使用全局变量(某些 class 类型)。
我希望能够使用智能指针,这样我就不用担心删除它了。
在某些文件 Common.hpp
文件中我有声明:
extern unique_ptr<CommandBuffer> globalCommandBuffer;
在我的 main.cpp 中:
#include "Common.hpp"
int main(int argc, char* argv[]) {
globalCommandBuffer(new CommandBuffer());
}
这会造成许多编译错误。很明显我做错了。
我的问题是:
- 对全局变量使用智能指针是一个好的设计选择吗?
- 如果是这样,正确的做法是什么?
- 哪个智能指针更好?
你想要:
globalCommandBuffer.reset(new CommandBuffer());
或者:
globalCommandBuffer = std::make_unique<CommandBuffer>();
全局变量很少是个好主意。
如果您想要全局(您可能不需要,但以防万一),只需创建一个全局即可。智能指针的全部意义在于管理所有权和生命周期。在全局的情况下,这些通常是微不足道的——您希望它们在其他任何事情发生之前就存在,并继续存在直到其他一切停止发生。
除非您需要与此不同的东西,否则只需将您的对象创建为全局对象,而不是指向动态分配对象的智能指针。
问题不在于全局变量,它是一些 smart_ptr,但问题是您在头文件中定义了一次,然后又在 main.cpp 中定义了它。双重定义肯定会有问题。