调试size_t不能作为数据成员工作的原因



谁能告诉我为什么第一个程序崩溃,而第二个程序没有?第一个(崩溃):

#include <cstdlib>
class test
{
public:
    test(const char *cstr)
    {
        size_t j=0;
        while(cstr[n++])
            ;
        //n = j;
    }
private:
    size_t n;
};
int main()
{
    test("Hello, world!n");
    return 0;
}

第二个不会崩溃(使用构造函数的局部变量而不是数据成员来计数):

   #include <cstdlib>
    class test
    {
    public:
        test(const char *cstr)
        {
            size_t j=0;
            while(cstr[j++])
                ;
            n = j;
        }
    private:
        size_t n;
    };
    int main()
    {
        test("Hello, world!n");
        return 0;
    }

在windows上运行MinGW。: * (运行)错误-1073741819

很简单,因为在您的第一个示例中,构造函数在初始化之前使用了n(实际上,n从未初始化)。

所以这行

while(cstr[n++])

是未定义行为。

试题:

   test(const char *cstr) : n(0)  // <-- initialize n
    {
        size_t j=0;
        while(cstr[n++])
            ;
        //j = n;
    }

在第一种情况下,您使用未初始化的n,这就是为什么您的程序崩溃,这是未定义行为(UB)的可能性之一。使用未初始化的变量调用UB。

test(const char *cstr)
{
    size_t j=0; //<--- here you want to do : n = 0;
    while(cstr[n++])
        ;
    //j = n;
 }

或者更好的是,您应该使用member-initialization-list作为:

test(const char *cstr) : n(0)
{                    //^^^^^^ it is member-initialization-list
    while(cstr[n++]) ; 
}

确保cstr是空终止字符串,否则您的代码仍然会有UB

第一个示例中的私有成员size_t_n从未初始化。其值未定义。在while循环前添加n=0,它应该可以正常工作。

最新更新