сбой ofstream при первом выводе в чрезвычайно простой программе (GCC / Code :: Blocks) - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть кросс-платформенное приложение для ведения журналов, которое я разрабатывал для Windows с MSVC на выходных, а затем на моем linux box с помощью GCC / Code :: Blocks этим утром оно вылетает, как только открывает выходной файлиспользуя ofstream.

Конкретный код выглядел следующим образом: буквально первые 8 строк выполнялись в программе

stringstream strFile;
strFile<<filename;
strFile<<".result.out";

out.open(strFile.str().c_str());
out<<"Count"<<"\t";
out<<"TM"<<"\t";
out<<"Type"<<"\t";
out<<"Seconds"<<"\t";

. После выяснения проблемы я позже создал минимальное приложение, котороете же симптомы

#pragma pack(1) // remove this and it will run without incident
#include <fstream>

using namespace std;

int main()
{
    ofstream out;
    out.open("test.txt");
    for(int x = 0;x < 10000; x++)
    {
      out<<"This is a test"<<endl; // crashes on first output
    }
    out.close();

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я настоятельно рекомендую всем прекратить использование этих атрибутов pragma pack специально по этой причине (поскольку они могут сбежать, и я видел, что это происходит и в производстве).

Вместо этого индивидуально применяйте атрибуты пакета кструктуры по мере необходимости, используя синтаксис вашего компилятора (то есть attribute packed).

0 голосов
/ 11 февраля 2019

То, что #pragma pack(1) изменяет ABI всех впоследствии включенных заголовочных файлов, делая стандартную библиотеку C ++ (.so или .a) несовместимой с вашим приложением.

Решение состоит в том, чтобы удалить это #pragma pack(1).Наносите упаковку на свои конструкции индивидуально.

...