Приведенный ниже код дает сбой при компиляции на старом ppc mac (журнал сбоя под кодом).На более новом Mac он печатает пустую строку и «Тест».Я могу понять, что порядок инициализации test :: mName и инициализации глобального test obj не может быть гарантирован (в реальном коде они находятся в разных файлах), но кажется, что на старом mac mName находится вкакое-то частично инициализированное состояние при вызове конструктора.Этот код недействителен или есть проблема с компилятором?
#include <iostream>
#include <string>
class test
{
public:
test();
static std::string mName;
};
test obj;
std::string test::mName("Test");
test::test()
{
std::cout << mName << std::endl;
}
int main(int argc, char *argv[])
{
std::cout << obj.mName << std::endl;
return 0;
}
Журнал сбоя:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000fffffff4
Crashed Thread: 0
Thread 0 Crashed:
0 libstdc++.6.dylib 0x90aa4268 std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char,std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char,std::char_traits<char> >&, std::basic_string<char,std::char_traits<char>, std::allocator<char> > const&) + 64
1 crash 0x00001b28 test::test() + 48
2 crash 0x00001de0 __static_initialization_and_destruction_0(int, int) + 144
3 crash 0x00001e98 _GLOBAL__I_obj + 32
4 dyld 0x8fe13830 ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 252
5 dyld 0x8fe0f244 ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int) + 384
6 dyld 0x8fe0f368 ImageLoader::runInitializers(ImageLoader::LinkContext const&) + 60
7 dyld 0x8fe03844 dyld::initializeMainExecutable() + 132
8 dyld 0x8fe08140 dyld::_main(mach_header const*, unsigned long, int, char const**, char const**, char const**) + 3420
9 dyld 0x8fe01770 dyldbootstrap::start(mach_header const*, int, char const**, long) + 988
10 dyld 0x8fe01044 _dyld_start + 56