Обход строки с ++, заканчивающийся строкой с нулевым символом - PullRequest
1 голос
/ 08 апреля 2010

Я использую boost :: program_options, и он страдает от того же, что и многие другие библиотеки C ++, даже сам STD: он по-прежнему использует строки с нулевым символом в конце в стиле C, потому что на самом деле никто не любит слабые std::string.

Рассматриваемый метод:

options_description_easy_init&
operator()(const char* name,
           const value_semantic* s,
           const char* description);

Типичный вариант использования просто отлично:

options.add_options()
    ("graphical", bool_switch(&isGraphical)->default_value(false),
     "Show any graphical output during runtime")

Однако мне нужно, чтобы имя опции было установлено динамически. Причина в том, что в некоторых случаях мне нужен собственный префикс, который добавляется в строку моей функцией std::string key(const std::string& k):

options.add_options()
    (key("graphical"), bool_switch(&isGraphical)->default_value(false),
     "Show any graphical output during runtime")

Это не удалось.

Теперь я могу использовать c_str () для std :: string, но это зло - я не знаю, как долго program_options хранит переменную и если моя строка все еще жива, когда это необходимо.

Я мог бы также зарезервировать память в буфере и т.д. и передать это. Буфер никогда не освобождается, и он сосет / является злом.

Есть ли что-нибудь еще, что я могу сделать, чтобы обойти беспорядок в стиле C в этой ситуации?

Ответы [ 2 ]

7 голосов
/ 08 апреля 2010

Это довольно строгое соглашение не держаться за const char * за пределами срока действия вызова функции, подобного этому. Пока они не нарушают это соглашение, .c_str() - ожидаемый и лучший способ сделать то, что вы пытаетесь сделать, IMO.

options.add_options()
    (key("graphical").c_str(), bool_switch(&isGraphical)->default_value(false),
     "Show any graphical output during runtime")
1 голос
/ 08 апреля 2010

Я согласен с Уиллом, что маловероятно, что на параметр будет ссылаться после вызова функции.Однако, если вы действительно думаете, что это проблема, вы можете использовать статическую строку или массив символов для хранения вывода key () и передать его в operator () () ,Хотя это может быть то же самое, что и утечка памяти в зависимости от вашей точки зрения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...