tôi có chương trình đồ chơi sau đó cung cấp cho lỗi với gcc MacPorts trên OSX 10,6boost :: program_options cho lỗi malloc
#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;
}
Tôi có tăng phiên bản 1,52 cài đặt với MacPorts. Tôi biên dịch chương trình như
g++ a.cpp -lboost_program_options-mt -L/opt/local/lib -g -O0
Nó biên dịch tốt:
$ ./a.out
Program continues
Nhưng nó không thể in các thông báo trợ giúp:
$ ./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
Tôi đã nghe nói rằng những thứ như thế này có thể xảy ra nếu thư viện được biên dịch với một phiên bản khác của gcc so với phiên bản được sử dụng để xây dựng chương trình. Làm cách nào để kiểm tra điều này? Tôi có
$ g++ --version
g++ (MacPorts gcc47 4.7.2_2) 4.7.2
Cập nhật: điều này dường như làm việc trên một máy Linux với và Boost cũ.
Cập nhật 2: đầu ra của gdb sau
(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)
Cập nhật 3: Chương trình này hoạt động tốt với các gcc42 Xcode, vấn đề chỉ xảy ra với gcc MacPorts.
Mã này có vẻ đúng với tôi (so với mã nguồn của tôi bằng cách sử dụng program_options). Bạn có thể chạy điều này trong gdb (biên dịch với -ggdb3 -O0 và chạy 'gdb --args ./a.out --help' và gõ' run' và 'bt') không? –
@ RafałRawicki, chỉ cần thêm thông tin gdb sau khi biên dịch với cờ của bạn – highBandWidth