C ++ Удаление неиспользуемого атрибута класса Причины std :: logic_error - PullRequest
0 голосов
/ 22 октября 2018

У меня есть класс с несколькими атрибутами, как показано ниже, моя проблема в том, что когда я удаляю или помещаю атрибут 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 голосов
/ 22 октября 2018

Похоже, я нашел решение.

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 */
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...