C++ 静态std::unique_ptr在.cpp中声明,但也在相应的.h文件中调用和使用

C++ 静态std::unique_ptr在.cpp中声明,但也在相应的.h文件中调用和使用,c++,nullpointerexception,static,unique-ptr,C++,Nullpointerexception,Static,Unique Ptr,我在X.cpp的getter中声明了一个static std::unique\ptr map,用于访问X.cpp和X.h中的map: std::unique_ptr&getMap(){ 静态std::unique_ptr xMap; 返回xMap; } 但是,在X.h中,我似乎遇到了读取访问冲突,表示指针为空 最好的选择是将getter移动到X.h文件中吗?您有一个静态指针,但从不将其设置为任何值。它应该是static auto xMap=std::make_unique()。然而,由于您的对

我在
X.cpp
的getter中声明了一个
static std::unique\ptr map
,用于访问
X.cpp
X.h
中的
map

std::unique_ptr&getMap(){
静态std::unique_ptr xMap;
返回xMap;
}
但是,在
X.h
中,我似乎遇到了读取访问冲突,表示指针为空


最好的选择是将getter移动到
X.h
文件中吗?

您有一个
静态
指针,但从不将其设置为任何值。它应该是
static auto xMap=std::make_unique()。然而,由于您的对象是静态的,所以您可能只需要
静态std::map xMap并返回一个
std::map&
。无论哪种方式,您都不太可能像这样返回
唯一的\u ptr
引用。任何人都可以
.reset()
它。这就解决了它-谢谢!关于您答案的最后一部分,我考虑通过“const reference”传递它,但意识到在使用getter函数时需要更改“std::unique_ptr”的内容。老实说,我不知道以前的代码所有者为什么在这里使用getter函数——我认为更好的选择是将'xMap'作为成员变量'std::unique_ptr',而不是由getter访问。我唯一感到困惑的另一件事是为什么它是“静态的”(它最初是一个“静态std::map”,但我将它改为“静态std::unique\u ptr>”来修复一个bug)。使用
static
成员函数而不是
static
数据成员的一个原因是为了避免与初始化顺序相关的问题。局部
静态
变量在第一次使用时初始化,因此通过使用成员函数,您可以更好地控制该变量<不同翻译单元(.cpp文件)中的代码>静态
数据成员以未指定的顺序初始化,在某些情况下,如果一个
静态
数据成员的初始化依赖于另一个翻译单元中的另一个数据成员,则会出现问题。这是“Meyers’Singleton”模式。如果此处实际需要
唯一的\u ptr
(几乎肯定不是),那么您仍然可以通过返回
*xMap
来返回引用。我无法想象将非常量
unique\u ptr
返回给单例是正确的解决方案。如果看起来它修复了一个bug,那么这很可能只是隐藏了一个更重要的底层bug。如果这是正确的解决方案,我很想了解更多关于它修复的问题。我想我们认为一个
std::unique\u ptr
将有助于修复iOS上的销毁顺序错误。这发生在外部静态对象的破坏上,外部静态对象在内部指的是
静态xMap
。我们认为
xMap
或者在使用
getMap()
访问
xMap
之前使用的互斥锁已经失效,并且认为检查
xMap
在使用之前是否处于活动状态,或者继续使用,将有助于解决该错误。