我有一个具有如下所示属性的类,我的问题是,当我将string s
属性删除或放置在std::atomic<char*> atomic_input
之前时,程序会异常终止:
'std :: logic_error'
what():basic_string :: _ M_construct null无效
已中止(核心已弃用)
#include <string>
#include <atomic>
// In ui.cpp
class UI
{
private:
std::atomic<char*> atomic_input;
std::string s; /* this can be renamed, but removing or placing it
before the above field crashes the program */
};
// In main.cpp
#include "ui.cpp"
int main()
{
srand (time(NULL));
initscr(); /* start the curses mode */
UI* ui = new UI();
return 0;
}
在程序中不能以任何方式不访问字符串属性,因此可以重命名。我有一个atomic
字段的原因是该值在多个线程之间共享。
我尝试将string
字段放在类属性内的不同行中,仅当声明位于 atomic_input
之前,程序才会崩溃。
可能是什么原因引起的问题?与应该如何定义C ++中的类有关?
答案 0 :(得分:-2)
好像我找到了解决方案。
std::atomic<char*> atomic_input
未被初始化(如下所示)是导致此问题的原因。我仍然不知道string
变量如何干扰它。
我的猜测是,编译器以某种方式将string
解释为atomic_input
的构造函数。仅在运行时而不是编译中访问atomic_input
时才会发生错误。
#include <string>
#include <atomic>
// In ui.cpp
class UI
{
private:
std::atomic<char*> atomic_input{(char*)""};
// std::string s; /* Initializing the atomic char like above solved the problem */
};