Ошибка памяти при вставке выходных данных для создания экземпляра std ::basic_ostream в QNX

#c #qnx

#c #qnx

Вопрос:

У меня следующий сценарий:

 #include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <ostream>

class File_ostream final : public std::basic_ostream<char, std::char_traits<char>>
{
};

int main()
{
    const std::string input_file{"file_tests/test.txt.gz"};
    std::ifstream ifs{input_file, std::ios_base::in | std::ios_base::binary};

    File_ostream file_os{};

    file_os << ifs.rdbuf(); // Memory fault (core dumped) 
}
  

Моя программа всегда вылетает при вставке выходных данных в file_os и создает дамп ядра.

Код отлично работает в Linux, но не в QNX :

У вас есть какое-либо объяснение? подсказка?

Комментарии:

1. Специально ли конструктор ничего не делает со своим аргументом os ?

2. @sebrockm У меня такая же проблема с конструктором или без него. Я обновлю пример кода.

3. Какой компилятор вы используете? basic_ostream не имеет конструктора по умолчанию. Любой компилятор, совместимый со стандартом, не будет компилировать предоставленный фрагмент кода.

4. @sebrockm в Linux я использую g , а для QNX я использую QCC. Обе версии 5.4.0

5. Хорошо, странно. Я проверил, что gcc действительно компилирует его, так же как и clang. msvc не может правильно его скомпилировать. В любом случае, если он скомпилируется, ваш basic_ostream экземпляр будет находиться в не документированном, не стандартизированном состоянии. Это может объяснить сбой. Попробуйте использовать правильный конструктор: en.cppreference.com/w/cpp/io/basic_ostream/basic_ostream

Ответ №1:

Проблема в том, что вы используете конструктор по умолчанию для basic_ostream которого, по стандарту, не существует. Я понятия не имею, почему g и QCC успешно компилируют ваш код, но они не должны.

В любом случае, использование нестандартизированных функций приводит к нестандартизированному поведению, в вашем случае к сбою. Я не знаю, задокументировано ли правильное использование конструктора по умолчанию где-либо в документах gcc, но просто избежать этого и использовать вместо этого правильный конструктор, должно решить вашу проблему.