2013-02-15 4 views
0

런타임 코드 옵션을 허용하는 다음 코드 단편을 가지고 있습니다. 명령 줄에 --help가 없으면 모든 것이 잘 작동합니다. --help 호출에 나는받을implicit_value가 다른 곳에서 사용될 때 boost :: program_options가 충돌합니다.

의 malloc : *에 대한 오류 객체 0x7fff7b646570 : 포인터 * 가 부스트 :: 어떤 :: 홀더 클래스에

을 디버깅 malloc_error_break에 중단 점을 설정 할당되지 않은 해제되고 . implicit_value 설정이 제거되면 모든 것이 잘 작동합니다 (--help도 포함). 내가 여기서 뭔가를 놓치고 있니?

TIA, Nikhil은

// program options descritor 
po::options_description allOpts(""); 
// general 
po::options_description genOpt("General options"); 
genOpt.add_options() 
("help", "produce help message") 
; 

// mandatory options 
po::options_description manOpt("Mandatory options"); 
manOpt.add_options() 
("tilesetData", po::value<std::string>()->required(), 
"tile set image file (required)") 
; 

// modifiables 
po::options_description modifiers("Modifiable options"); 
modifiers.add_options() 
("takeSnaps", po::value<std::string>()->implicit_value("gameShots"), 
"take screen shots after every display refresh") 
("music", po::value<std::string>()->implicit_value("NOT_SPECIFIED.mp3"), 
"play the music specified by the file") 
; 

// compile all options 
allOpts.add(genOpt).add(manOpt).add(modifiers); 
// parse command line 
po::variables_map vm; 
po::store(po::parse_command_line(argc, argv, allOpts), vm); 

// create help message 
if (vm.count("help")) { 
    std::cout << allOpts << std::endl;; 
    return false; 
} 



// check program options 
try { 
    po::notify(vm); 
} 

catch (std::exception& e){ 
    std::cerr << "Error: " << e.what() << std::endl; 
    return false; 
} 
catch(...){ 
    std::cerr << "Unknown error!" << std::endl; 
    return false; 
} 

답변

0

나는이 컴파일러 버전 간의 비 호환성 때문입니다 생각한다. 아마도 여러분이 사용하고있는 boost 버전은 프로그램을 컴파일하는 데 사용하는 버전보다 오래된 버전의 gcc로 컴파일되었을 것입니다. 해결 방법은 동일한 컴파일러를 사용하여 프로그램을 컴파일하고 컴파일하는 것입니다.