Я пытаюсь создать функцию, которая уплотняет функцию sprintf, но я как-то столкнулся со следующей проблемой:
В первой строке после вызова класса (раньше это была функция, но она тоже не работала) я получаю правильный результат: http://puu.sh/1m1Bw
Но строка после того, как я получаю что-то совершенно другое, хотя я даже не трогал класс или переменную: http://puu.sh/1m1BR
Может кто-нибудь объяснить мне, что здесь происходит?
Редактировать: Забыл реальный класс:
StringCreator::StringCreator(char* _parten, ...) {
char buff[255];
va_list args;
va_start (args, _parten);
vsprintf (buff,_parten, args);
va_end(args);
this->str = buff;
}
И в файле .h:
class StringCreator {
public:
StringCreator(char* _parten, ...);
char* str;
};
После StringCreator()
конструктор завершает переменную-член this->str
является висящим указателем, так как он указывает на buff
которая является локальной переменной конструктора. Доступ к this->str
после конструктора неопределенное поведение. изменения str
из char*
к std::string
это решение, и если вам нужен доступ к const char*
ты можешь использовать str.c_str()
, Используя std::string
также означает, что конструктор копирования по умолчанию и оператор присваивания являются правильными.
Если, как указано в комментарии к этому ответу, вы new char[255]
вместо использования std::string
тогда вам нужно либо сделать StringCreator
не копировать или реализовать конструктор копирования и оператор присваивания, который копирует содержимое str
, Увидеть Что такое правило трех? В качестве альтернативы, вы могли бы иметь char str[255];
и избежать динамического выделения и копирования по умолчанию StringCreator
было бы правильно.
Чтобы избежать возможного переполнения буфера при вызове vsprintf()
использование vsnprintf()
вместо этого (если ваш компилятор поддерживает C99), который принимает в качестве аргумента размер заполняемого буфера и не записывает больше указанного размера.
Других решений пока нет …