C ++ char数组损坏?

时间:2012-11-03 19:41:05

标签: c++ arrays char corruption

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

1 个答案:

答案 0 :(得分:2)

StringCreator()构造函数完成后,成员变量this->str是一个悬空指针,因为它指向buff,它是构造函数的局部变量。在构造函数之后访问this->str是未定义的行为。将strchar*更改为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),它接受作为参数填充的缓冲区的大小,并且写入不超过指定大小。