简体   繁体   English

Xcode STL C ++ Debug编译错误

[英]Xcode STL C++ Debug compile error

I have some file writing code that works as expected, but prints an error on Debug mode, no output errors in Release. 我有一些文件编写代码按预期工作,但在调试模式下输出错误,在Release中没有输出错误。

Code: 码:

#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;
}

Debug Output: 调试输出:

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

Release Output: 发布输出:

FileIO implementation C++
Please enter the filename to create: Running…
myfile
Created: myfile.txt

Aside from not checking for the file descriptor being open (for simplicity) what is wrong with this code? 除了没有检查文件描述符是否打开(为简单起见)这个代码有什么问题?

Update: I broke the code down to the following and it still errors: 更新:我将代码分解为以下内容,但仍然存在错误:

 string cppfilename; 
 getline(cin, cppfilename);    // error here

This looks to me like a bug in Apple's libstdc++ , at least when compiled in debug mode. 这看起来像Apple的libstdc++一个错误,至少在调试模式下编译时。 If I compile the two line reduction you gave above: 如果我编译上面给出的两行减少:

#include <iostream>
#include <string>

using namespace std;

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

  return 0;
}

With the following command line (with defines taken from Xcode's default settings for a Debug build in a C++ project): 使用以下命令行(定义取自Xcode在C ++项目中的Debug构建的默认设置):

g++ -D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1 -g -o getline getline.cpp

Then I get the same error that you saw: 然后我得到你看到的同样的错误:

$ ./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

This pops up a crash report, which gives us a stack trace (you can also get a stack trace from the debugger by running this under Xcode; I just wanted to reproduce it in as clean an environment as possible, to try and isolate the cause, without anything else strange Xcode might be doing): 这会弹出一个崩溃报告,它给我们一个堆栈跟踪(您也可以通过在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

This looks an awful lot like a bug to me. 对我来说这看起来很糟糕。 We're using some standard library functions in the most trivial possible way, and hitting an assertion failure. 我们以最微不足道的方式使用一些标准库函数,并且遇到断言失败。

At this point, if we were using proprietary software (which much of Apple's software is, but luckily libstdc++ is free software), we would have to give up, file a bug report with our vendor , and try to find a workaround. 在这一点上,如果我们使用专有软件(Apple的大部分软件,但幸运的是libstdc++是免费软件),我们将不得不放弃, 向我们的供应商提交错误报告 ,并尝试找到解决方法。 Luckily, this is free software, so we can investigate the root cause. 幸运的是,这是免费软件,所以我们可以调查根本原因。 Unfortunately, I don't have the time at the moment to track this down to the root cause, but the source is available for perusal. 不幸的是,我现在没有时间跟踪这个根本原因,但是可以查看来源

You should probably file a bug about this . 您应该提交一个关于此的错误 A workaround in this case would be to remove the _GLIBCXX_DEBUG=1 definition (and probably the _GLIBCXX_DEBUG_PEDANTIC=1 as well). 这种情况下的解决方法是删除_GLIBCXX_DEBUG = 1定义(也可能是_GLIBCXX_DEBUG_PEDANTIC = 1)。 You can do this in Xcode by finding your Target, double clicking on the executable it builds, going to the build tab, making sure the configuration is set to Debug, scrolling down to the GCC 4.2 - Preprocessing section, and deleting the two values from the Preprocessor Macros line. 您可以在Xcode中执行此操作,方法是找到Target,双击它构建的可执行文件,转到构建选项卡,确保配置设置为Debug,向下滚动到GCC 4.2 - 预处理部分,并从中删除这两个值预处理器宏行。 This way the code will build and run, and seems to work in this case, but you'll get fewer assertions that the debug build of the standard library might have been able to catch. 这样代码将构建并运行,并且似乎在这种情况下工作,但是您将获得更少的断言,标准库的调试版本可能已经能够捕获。

This looks to be another case of _GLIBCXX_DEBUG being broken with gcc 4.2 on Mac OS X . 这看起来是另一种_GLIBCXX_DEBUG在Mac OS X上被gcc 4.2破坏的情况。

Your best options look to be to drop _GLIBCXX_DEBUG or to switch to gcc 4.0. 您最好的选择是删除_GLIBCXX_DEBUG或切换到gcc 4.0。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM