#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, но просто избежать этого и использовать вместо этого правильный конструктор, должно решить вашу проблему.