在Mac OS X Snow Leopard的Xcode 3.2.1中,我打开一个项目: C ++ stdc ++类型的命令行工具。 我有以下简单的代码:
#include <iostream>
#include <string>
using namespace std;
int main(){
string myvar;
cout << "Enter something: " << endl;
cin >> myvar;
cout << endl << myvar << endl;
return 0;
}
程序编译正常,并提示我“输入内容”。当我输入内容,然后按回车键时,我收到以下错误:
myproject(766) malloc: *** error for object 0x1000041c0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Program received signal: “SIGABRT”.
sharedlibrary apply-load-rules all
(gdb)
在另一台计算机上编译早期版本的Xcode(3.1.2)时(使用'命令行实用程序'选项打开项目,3.2.1中不存在),代码运行时没有问题。
有人知道发生了什么吗? 谢谢, 尤瓦
答案 0 :(得分:8)
据我所知,我在x86_64
的发布模式下没有遇到此问题。但我在Debug x86_64
中看到了这个问题。如果我按照directions given by Howard in this post,我可以让它在调试模式下运行:
_GLIBCXX_DEBUG=1 _GLIBCXX_DEBUG_PEDANTIC=1
构建并运行,你会发现它有效。另一个有趣的观察是单独使用__gnu_debug::string
(来自<debug/string>
标题)不会触发错误。
编辑:来自马口(known issues in XCode 3.2.1)
默认的gcc 4.2编译器与标准C ++库调试模式不兼容。使用Xcode 3.2编译的C ++程序可能无法在Debug配置中使用。要解决此问题,请将编译器版本设置为4.0,或编辑调试配置的预处理器宏并删除条目:
_GLIBCXX_DEBUG=1 _GLIBCXX_DEBUG_PEDANTIC=1
您可以导航到/Developer/Library/Xcode/Project Templates/Application/Command Line Tool/C++ Tool/C++Tool.xcodeproj/
并修改project.pbxproj
并删除第138行周围的行来为所有项目执行此操作:
"_GLIBCXX_DEBUG=1",
"_GLIBCXX_DEBUG_PEDANTIC=1",
答案 1 :(得分:2)
更简单的方法来完成同样的事情:在程序的最开头粘贴这些行(在任何#include语句之前):
#define _GLIBCXX_FULLY_DYNAMIC_STRING 1
#undef _GLIBCXX_DEBUG
#undef _GLIBCXX_DEBUG_PEDANTIC
显然,这只会影响当前的项目。