C++ C++;gcc下的SEGFULT+;mingw而非gcc+;linux

C++ C++;gcc下的SEGFULT+;mingw而非gcc+;linux,c++,gcc,mingw,C++,Gcc,Mingw,我在Mingw下有一个sefault,但在Linux下没有。我设法将其简化为以下代码: #include <iostream> #include <string> #include <map> using namespace std; const std::string& getConfiguration(const std::string& key, std::map<std::string, std::string> con

我在Mingw下有一个sefault,但在Linux下没有。我设法将其简化为以下代码:

#include <iostream>
#include <string>
#include <map>

using namespace std;

const std::string& getConfiguration(const std::string& key, std::map<std::string, std::string> configuration)
{
    map<string, string>::const_iterator it = configuration.find(key);
    return it->second;
}

int main() {
    map<string, string> testmap;
    testmap["key"] = "value";
    map<string, string>::const_iterator it;
    it = testmap.find("key");
    const string& value = it->second;
    cout << value << endl;
    cout << "ok!" << endl;
    const string& valuebis = getConfiguration("key", testmap);
    cout << valuebis << endl;
    cout << "Mingw segfaults before here" << endl;
    return 0;
}
(但是我得到了与i686-pc-mingw32.static相同的结果)并且我在gdb中得到了以下错误:

Starting program: Z:\test-conv.exe
[New Thread 17328.0x43b4] 
value
ok!

Program received signal SIGSEGV, Segmentation fault.
std::operator<< <char, std::char_traits<char>, std::allocator<char> > (__os=warning: RTTI symbol not found for class 'std::ostream'
..., __str=<error reading variable: Cannot access memory at address 0xfeeefee2>)
    at /home/eroux/softs/mxe-64/tmp-gcc-i686-w64-mingw32.static/gcc-4.9.1.build/i686-w64-mingw32.static/libstdc++-v3/include/bits/basic_string.h:2777
2777    /home/eroux/softs/mxe-64/tmp-gcc-i686-w64-mingw32.static/gcc-4.9.1.build/i686-w64-mingw32.static/libstdc++-v3/include/bits/basic_string.h: No such file or directory.
(gdb) bt
#0  std::operator<< <char, std::char_traits<char>, std::allocator<char> > (__os=warning: RTTI symbol not found for class 'std::ostream'
..., __str=<error reading variable: Cannot access memory at address 0xfeeefee2>)
    at /home/eroux/softs/mxe-64/tmp-gcc-i686-w64-mingw32.static/gcc-4.9.1.build/i686-w64-mingw32.static/libstdc++-v3/include/bits/basic_string.h:2777
#1  0x0040181a in main () at ConventionTest.cpp:22
启动程序:Z:\test-conv.exe
[新螺纹17328.0x43b4]
价值
好啊
程序接收信号SIGSEGV,分段故障。

std::operator
getConfiguration
返回对本地对象的引用(因此调用UB),将
configuration
作为常量引用传递(或返回字符串的副本)。

这是因为。原因是在
getConfiguration
函数中,您通过值传递映射,然后返回对此映射中某个条目的引用,该引用将在函数返回时被销毁

Starting program: Z:\test-conv.exe
[New Thread 17328.0x43b4] 
value
ok!

Program received signal SIGSEGV, Segmentation fault.
std::operator<< <char, std::char_traits<char>, std::allocator<char> > (__os=warning: RTTI symbol not found for class 'std::ostream'
..., __str=<error reading variable: Cannot access memory at address 0xfeeefee2>)
    at /home/eroux/softs/mxe-64/tmp-gcc-i686-w64-mingw32.static/gcc-4.9.1.build/i686-w64-mingw32.static/libstdc++-v3/include/bits/basic_string.h:2777
2777    /home/eroux/softs/mxe-64/tmp-gcc-i686-w64-mingw32.static/gcc-4.9.1.build/i686-w64-mingw32.static/libstdc++-v3/include/bits/basic_string.h: No such file or directory.
(gdb) bt
#0  std::operator<< <char, std::char_traits<char>, std::allocator<char> > (__os=warning: RTTI symbol not found for class 'std::ostream'
..., __str=<error reading variable: Cannot access memory at address 0xfeeefee2>)
    at /home/eroux/softs/mxe-64/tmp-gcc-i686-w64-mingw32.static/gcc-4.9.1.build/i686-w64-mingw32.static/libstdc++-v3/include/bits/basic_string.h:2777
#1  0x0040181a in main () at ConventionTest.cpp:22