0

我正在尝试构建一个压缩 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;
};
4

1 回答 1

2

StringCreator()构造函数完成后,成员变量是this->str一个悬空指针,因为它指向buff的是构造函数的局部变量。在构造函数之后访问this->str是未定义的行为。str从 a更改char*为 astd::string是一种解决方案,如果您需要访问 aconst char*您可以使用str.c_str(). 使用 astd::string也意味着默认的复制构造函数和赋值运算符是正确的。

如果如对此答案的评论中所述,您new char[255]不使用 a std::string,那么您需要使StringCreator不可复制或实现复制构造函数和赋值运算符来复制str. 请参阅什么是三法则?或者,您可以拥有char str[255];并避免动态分配,并且默认复制StringCreator是正确的。

为了避免调用vsprintf()使用时潜在的缓冲区溢出vsnprintf()(如果您的编译器支持 C99),它接受正在填充的缓冲区的大小作为参数,并且写入的内容不超过指定的大小。

于 2012-11-03T19:52:11.357 回答