【发布时间】:2018-05-26 10:23:06
【问题描述】:
下面的代码在旧的 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
【问题讨论】:
标签: macos gcc compiler-errors initialization powerpc