C ++删除未使用的类属性会导致std :: logic_error

时间:2018-10-22 10:32:28

标签: c++ string class exception atomic

我有一个具有如下所示属性的类,我的问题是,当我将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 ++中的类有关?

1 个答案:

答案 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 */
};