Instantiating fstream corrupts most recently defined std::string on -O0 but not -03

Viewed 50
#include <iostream>
#include <fstream>
int main(int argc, char* argv[])
{
    const std::string string_2 = "string_2";
    const std::string string_1 = "string_1";

    std::cout << string_2 << std::endl;
    std::cout << string_1 << std::endl;
    std::fstream beep("abcd");
    std::cout << string_2 << std::endl;
    std::cout << string_1 << std::endl;
    printf("%s", string_1.c_str());
}

I am using CMake. When I run this with set(CMAKE_CXX_FLAGS_RELEASE "-O0 -DNDEBUG"), I get the following bad output:

string_2
string_1
string_2
╘       ±o☻
╘       ±o☻

But when I run it after compiling it with -03, the problem does not exist.

Clearly, string_1's value has been changed by the instantiation of an ifstream.

If I change the code to define string_2 after string_1, it is instead string_2 that is changed. If I make the strings static, then no change occurs.

So what is clear to me is that the most recently-defined string which is not static is having its value corrupted when the fstream is instantiated.

Why could this be happening?

I am using CLion 2019.1, using a MinGW environment (mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32)

Using the bundled CMake, and MinGW's bundled g++.

0 Answers
Related