Xcode STL C++ Debug编译错误

Bro*_*olf 4 c++ macos xcode runtime-error

我有一些文件编写代码按预期工作,但在调试模式下输出错误,在Release中没有输出错误.

码:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

using namespace std;

int main (int argc, char * const argv[]) {
    string cppfilename; 
    std::cout << "Please enter the filename to create: ";

    while ( cppfilename == "" ) {
        getline(cin, cppfilename);    // error occurs here
    }

    cppfilename += ".txt";
    ofstream fileout;
    fileout.open( cppfilename.c_str() );
    fileout << "Writing this to a file.\n"; 
    fileout.close();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

调试输出:

Please enter the filename to create: Running…
myfile
FileIO(5403) malloc: *** error for object 0xb3e8: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Created: myfile.txt
Run Code Online (Sandbox Code Playgroud)

发布输出:

FileIO implementation C++
Please enter the filename to create: Running…
myfile
Created: myfile.txt
Run Code Online (Sandbox Code Playgroud)

除了没有检查文件描述符是否打开(为简单起见)这个代码有什么问题?

更新:我将代码分解为以下内容,但仍然存在错误:

 string cppfilename; 
 getline(cin, cppfilename);    // error here
Run Code Online (Sandbox Code Playgroud)

Bri*_*ell 6

这看起来像Apple中的一个错误libstdc++,至少在调试模式下编译时是这样.如果我编译上面给出的两行减少:

#include <iostream>
#include <string>

using namespace std;

int main() {
  string cppfilename; 
  getline(cin, cppfilename);    // error here

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用以下命令行(定义取自Xcode在C++项目中的Debug构建的默认设置):

g++ -D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1 -g -o getline getline.cpp
Run Code Online (Sandbox Code Playgroud)

然后我得到你看到的同样的错误:

$ ./getline foo
getline(74318) malloc: *** error for object 0x1000021e0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap
Run Code Online (Sandbox Code Playgroud)

这会弹出一个崩溃报告,它给我们一个堆栈跟踪(您也可以通过在Xcode下运行它来从调试器获取堆栈跟踪;我只想在尽可能干净的环境中重现它,尝试找出原因,没有任何其他奇怪的Xcode可能正在做):

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libSystem.B.dylib               0x00007fff83c37fe6 __kill + 10
1   libSystem.B.dylib               0x00007fff83cd8e32 abort + 83
2   libSystem.B.dylib               0x00007fff83bf0155 free + 128
3   libstdc++.6.dylib               0x00007fff813e01e8 std::string::reserve(unsigned long) + 90
4   libstdc++.6.dylib               0x00007fff813e0243 std::string::push_back(char) + 63
5   libstdc++.6.dylib               0x00007fff813c92b5 std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char) + 277
6   getline                         0x00000001000011f5 std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) + 64 (basic_string.h:2451)
7   getline                         0x0000000100000cbf main + 34 (getline.cpp:10)
8   getline                         0x0000000100000c04 start + 52
Run Code Online (Sandbox Code Playgroud)

对我来说这看起来很糟糕.我们以最微不足道的方式使用一些标准库函数,并且遇到断言失败.

此时,如果我们使用专有软件(Apple的大部分软件,但幸运的libstdc++是免费软件),我们将不得不放弃,向我们的供应商提交错误报告,并尝试找到解决方法.幸运的是,这是免费软件,所以我们可以调查根本原因.不幸的是,我现在没有时间跟踪这个根本原因,但是可以查看来源.

您应该提交一个关于此的错误.这种情况下的解决方法是删除_GLIBCXX_DEBUG = 1定义(也可能是_GLIBCXX_DEBUG_PEDANTIC = 1).您可以在Xcode中执行此操作,方法是找到Target,双击它构建的可执行文件,转到构建选项卡,确保配置设置为Debug,向下滚动到GCC 4.2 - 预处理部分,并从中删除这两个值在预处理宏行.这样代码将构建并运行,并且似乎在这种情况下工作,但是您将获得更少的断言,标准库的调试版本可能已经能够捕获.


R S*_*hko 5

这看起来是另一种_GLIBCXX_DEBUG在Mac OS X上被gcc 4.2破坏的情况.

您最好的选择是删除_GLIBCXX_DEBUG或切换到gcc 4.0.