C++ 使用 getline() 打印:被释放的指针未在 XCode 中分配

Posted

技术标签:

【中文标题】C++ 使用 getline() 打印:被释放的指针未在 XCode 中分配【英文标题】:C++ using getline() prints: pointer being freed was not allocated in XCode 【发布时间】:2011-01-15 03:04:09 【问题描述】:

我正在尝试使用 std:getline() 但遇到一个奇怪的运行时错误:

malloc: * 对象 0x10000a720 的错误:未分配被释放的指针 * 在 malloc_error_break 中设置断点进行调试

这是产生此错误的代码:

//main.cpp
#include <iostream>
#include <sstream>

int main (int argc, char * const argv[])

   std::istringstream my_str("demo string with spaces");
   std::string word;

   while (std::getline(my_str, word, ' ')) 
        std::cout << word << std::endl;
   
   return 0;

在每个单词之前我都会收到此错误。从 cmets 看来,这似乎是 OSX/XCode 特定的错误。有什么提示吗?

更新: 该错误仅在调试模式下打印。如果我在发布模式下构建此代码,一切都很好。

更新 2: 更多关于该问题的信息可以在here找到。

解决方案:

设置

_GLIBCXX_FULLY_DYNAMIC_STRING=1

在目标信息构建选项卡中的预处理器宏中。

系统信息:

OSX 10.6.2 | XCode 3.2 | g++ 4.2 | i386 的调试配置

【问题讨论】:

它在我的机器上运行良好。虽然我没有使用 MacBook,所以这可能与它有关,但在带有 VS2008 的 XP 上,它编译并运行良好。 同样,它在我的 PPC Powerbook 上编译和运行也没有错误。带有 g++ 4.0.1 的 Mac OS 10.4。而且看起来不错…… 我也可以在 Visual Studio 2008 下编译并运行良好。 在我的 10.5.8 g++ 4.0.1 的 MacBook Pro 上运行良好,valgrind 也没有报告任何可疑情况。 @dan:看起来你的设置可能有点不靠谱。在新的终端中使用终端 g++ 尝试它,然后考虑重新启动,然后考虑重新安装开发者工具。 【参考方案1】:

至少有一个人报告了 Apple 上 g++ 4.2.1 的问题,这似乎与您的问题有关,这与使用 _GLIBCXX_FULLY_DYNAMIC_STRING 定义的标准库配置不当有关(我不了解我的任何内容)我在这里打字)。

您可能会从包含此消息的新闻组线程中获得一些线索:

http://gcc.gnu.org/ml/gcc-bugs/2009-10/msg00807.html

【讨论】:

就是这样。我重现了该问题并通过将_GLIBCXX_FULLY_DYNAMIC_STRING 添加到目标设置窗口来修复它。 (不要将它添加到 Project 设置窗口的“预处理”部分;那什么都不做。XCode,grrrrr...) 由于这是一个团队的努力,有人愿意报告错误吗?

以上是关于C++ 使用 getline() 打印:被释放的指针未在 XCode 中分配的主要内容,如果未能解决你的问题,请参考以下文章

如何正确释放与 getline() 函数相关的内存?

C++:将 ifstream 与 getline() 一起使用;

C ++中的getline输入错误[重复]

在 getline 之后在 C++ 中输入

Valgrind报告从stdin的getline后释放的指针上的内存泄漏

C++中getline函数的使用