我正在尝试构建一个压缩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;
};
答案 0 :(得分:2)
StringCreator()
构造函数完成后,成员变量this->str
是一个悬空指针,因为它指向buff
,它是构造函数的局部变量。在构造函数之后访问this->str
是未定义的行为。将str
从char*
更改为std::string
是一种解决方案,如果您需要访问const char*
,则可以使用str.c_str()
。使用std::string
也意味着默认的复制构造函数和赋值运算符是正确的。
如果对此答案的评论中指出,您new char[255]
而不是使用std::string
,那么您需要使StringCreator
不可复制或实施复制构造函数赋值运算符,用于复制str
的内容。请参阅What is The Rule of Three?或者,您可以char str[255];
并避免动态分配,StringCreator
的默认复制也是正确的。
为了避免在调用vsprintf()
时使用vsnprintf()
的潜在缓冲区溢出(如果您的编译器支持C99),它接受作为参数填充的缓冲区的大小,并且写入不超过指定大小。