gpt4 book ai didi

c++ - 访问冲突读取位置 0x000000004

转载 作者:行者123 更新时间:2023-11-30 01:20:11 24 4
gpt4 key购买 nike

我正在 Visual Studio 中进行 C++ 编码练习,并一直将此问题显示为标题。我知道问题发生在哪里,但我不知道为什么会发生以及如何解决。请帮我解决这个问题。

类模板.h

typedef std::string QuestionName;
class ClassTemplete
{
public:
ClassTemplete(Question iQuestionName);
private
static std::map<QuestionName,ClassTemplete *> questionName_questionPointer_map_;
}

类模板.cpp

map<QuestionName, ClassTemplete *> ClassTemplete::questionName_questionPointer_map_;

ClassTemplete::ClassTemplete(QuestionName iQuestionName)
{
ClassTemplete::questionName_questionPointer_map_[iQuestionName] = this;
}

chapter1_question1.h

class C1Q1 : public ClassTemplete
{
public:
C1Q1(QuestionName iQuestionName) : ClassTemplete(iQuestionName) {};
private:
static QuestionName question_name_;
static C1Q1 question_instance_;
}

chapter1_question1.cpp

QuestionName C1Q1::question_name_ = "C1Q1";
C1Q1 C1Q1::question_instance_(C1Q1::question_name_);

运行程序发现问题出在这个地方:

ClassTemplete::questionName_questionPointer_map_[iQuestionName] = this;

但是,我无法解释为什么会这样。

如果需要更多信息,请随时与我联系。

亲切的问候,

易记

最佳答案

QuestionName C1Q1:::question_name_ 相对于 ClassTemplate::questionName_questionPointer_map_ 的位置在哪里?它们似乎都是具有静态存储持续时间的变量,即它们是在 main() 运行之前构造的。但是,C++ 编译器/链接器仅使用一个翻译单元(在这种情况下,对象是从上到下构建的)对此类全局对象的构造进行排序,而不是在翻译单元之间(在这种情况下,对象以随机顺序构造)。

您的问题看起来好像 ClassTemplate::questionName_questionPointer_map 将在 C1Q1::question_name_ 之后构建。也就是说,当构造 C1Q1::question_name_ 时,正在访问一个尚未构造的对象。

传统的修复方法是使 static 对象成为其他对象所依赖的不是对象,而是具有局部 static 变量的函数返回一个引用:

std::map<QuestionName,ClassTemplete *>&
ClassTemplete::questionName_questionPointer_map_() {
static std::map<QuestionName,ClassTemplete *> rc;
return rc;
}

(请注意,当您不使用 C++11 时,此构造不是线程安全的;使用 C++11 时,它是线程安全的) .

关于c++ - 访问冲突读取位置 0x000000004,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19747920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com