【问题标题】:Using smart pointers as global variables使用智能指针作为全局变量
【发布时间】:2023-04-04 02:58:01
【问题描述】:

假设我有一个程序,我必须在其中使用一个全局变量(某种类类型)。

我希望能够使用智能指针,这样我就不必担心删除它了。

在某个文件Common.hpp 文件中我有声明:

extern unique_ptr<CommandBuffer> globalCommandBuffer;

在我的 main.cpp 中:

#include "Common.hpp"

int main(int argc, char* argv[]) {   
   globalCommandBuffer(new CommandBuffer());
}

这会产生许多编译错误。所以很明显我做错了。

我的问题是:

  • 对全局变量使用智能指针是一个好的设计选择吗?
  • 如果是这样,正确的做法是什么?
  • 哪种智能指针更可取?

【问题讨论】:

  • 是否有理由需要使用指针而不是普通变量?
  • 拥有全局变量通常不是一个好主意,不管是什么类型。至于您对智能指针的使用,您不应该将它们视为简单的自删除指针,而是从资源所有权的角度来考虑它们:资源一次是否可以有一个所有者,或多个同时拥有者。此外,由于 std::unique_ptr 的语义,将其作为全局变量类型确实没有多大意义,它应该作为参数传递。
  • @Galik 没有。但我不知道如何在不使用动态分配的情况下初始化我的变量
  • @EladMaimoni 如果您不需要动态分配,那么我会避免它,只需弄清楚如何初始化的语法(大多数参考/教程应该涵盖这一点)..

标签: c++ c++11 global-variables smart-pointers


【解决方案1】:

你想要:

globalCommandBuffer.reset(new CommandBuffer());

或者:

globalCommandBuffer = std::make_unique<CommandBuffer>();

全局变量很少是个好主意。

【讨论】:

    【解决方案2】:

    如果您想要一个全局变量(您可能不需要,但以防万一),只需创建一个全局变量。智能指针的全部意义在于管理所有权和生命周期。在全局的情况下,这些通常是微不足道的——您希望它们在其他任何事情发生之前就存在,并继续存在直到其他所有事情都停止发生。

    除非您需要不同的东西,否则只需将您的对象创建为全局对象,而不是指向动态分配对象的智能指针。

    【讨论】:

      【解决方案3】:

      问题不在于全局变量,它是一些 smart_ptr,但问题是您在头文件中定义了一次 - 并在 main.cpp 中再次定义。双重定义肯定会有问题。

      【讨论】:

      • OP 中的标头不包含任何定义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2014-05-18
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多