2011-08-21 56 views
0

有人可以告诉我为什么第一个程序崩溃,但第二个不是? 第一个(崩溃):调试为什么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

回答

7

很简单,因为在你的第一个例子中,构造函数使用n以往任何时候初始化之前(实际上,n永远不会被初始化)。

所以行

while(cstr[n++]) 

是不确定的行为。

尝试:

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

的私有成员为size_t n的第一个例子是永远不会初始化。它的值是未定义的。在while循环之前添加n = 0,它的工作原理应该是一样的。

3

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

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

或者更好的是,你应该使用成员初始化列表如下:

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

确保cstr是空值终止字符串,否则你的代码还是会有UB。

相关问题