【问题标题】:boost::program_options gives malloc errorboost::program_options 给出 malloc 错误
【发布时间】:2013-01-16 21:07:42
【问题描述】:

我有以下玩具程序,它在 OSX 10.6 上与 MacPorts gcc 出错

#include <boost/program_options.hpp>
namespace po = boost::program_options;

#include <iostream>
using namespace std;

int main(int ac, char* av[])
{
        po::options_description desc("Allowed options");
        desc.add_options()  ("help", "produce help message")  ;

        po::variables_map vm;        
        po::store(po::parse_command_line(ac, av, desc), vm);
        po::notify(vm);    

        if (vm.count("help")) {
            cout << desc << "\n";
            return 0;
        }
        cout << "Program continues\n";
        return 0;
}

我在 MacPorts 上安装了 boost 1.52 版。我将程序编译为

g++ a.cpp -lboost_program_options-mt -L/opt/local/lib -g -O0

编译正常:

$ ./a.out
Program continues

但它无法打印帮助信息:

$ ./a.out --help
Allowed options:
a.out(40110) malloc: *** error for object 0x7fff70ca3500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap

我听说如果库是使用与构建程序不同版本的 gcc 编译的,就会发生这样的事情。我该如何检查?我有

$ g++ --version
g++ (MacPorts gcc47 4.7.2_2) 4.7.2

更新:这似乎适用于具有更旧 Boost 的 Linux 机器。

更新 2:gdb 的输出如下

(gdb) run 
Starting program: /Users/yasir/Downloads/mask.util/a.out --help
Reading symbols for shared libraries ++++.. done
Allowed options:
a.out(42256) malloc: *** error for object 0x7fff70ca3500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Program received signal SIGABRT, Aborted.
0x00007fff821030b6 in __kill ()
(gdb) bt
#0  0x00007fff821030b6 in __kill ()
#1  0x00007fff821a39f6 in abort ()
#2  0x00007fff820bb195 in free ()
#3  0x00000001001188b4 in std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow ()
(gdb) 

更新 3:该程序在 Xcode gcc42 上运行良好,该问题仅在 MacPorts gcc 上出现。

【问题讨论】:

  • 这段代码对我来说是正确的(与我使用 program_options 的源代码相比)。你能在 gdb 中运行它吗(使用 -ggdb3 -O0 编译并运行 gdb --args ./a.out --help 并输入 runbt)?
  • @RafałRawicki,刚刚用你的标志编译后添加了 gdb 信息

标签: gcc boost malloc macports boost-program-options


【解决方案1】:

您的错误最可能的原因是 program_options 头文件中提供的接口与编译库中提取的实现之间存在不匹配。这可能是因为您不小心从不同版本的 boost 中获取了已编译的库,也可能是因为您使用与用于编译测试程序的编译器版本不同的编译器编译了库。

【讨论】:

  • 有没有办法检查例如它是哪个版本的编译库,或者使用哪个编译器生成库?
  • 在 Linux 上,您可以使用 objdump -x 查找大部分此类信息(SO 名称、glibc 和 cxxabi 版本)。虽然不了解 OS X
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多