簡體   English   中英

調試為什么size_t不能用作數據成員?

[英]Debug why does size_t not work as a data member?

有人可以告訴我為什么第一個程序崩潰,而第二個卻沒有嗎? 第一個(崩潰):

#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。 make: * [run]錯誤-1073741819

很簡單,因為在您的第一個示例中,構造n在初始化之前就使用了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是以null終止的字符串,否則您的代碼仍將包含UB。

第一個示例中的私有成員size_t n從未初始化。 其值是不確定的。 在您的while循環之前添加n = 0,它應該可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM