调试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。: * (运行)错误-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,它应该可以正常工作。
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 数据成员SFINAE的C++17测试:gcc vs clang
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 静态数据成员模板专用化的实例化点在哪里
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 友元函数无法访问私有数据成员 (c++)
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 将私有数据成员添加到野牛生成的类中
- 输入数据成员未按要求工作
- 二维矢量数据成员
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 调用在 HXX 文件中声明的静态数据成员
- 是否可以根据其数据成员的类型确定类型的大小
- c++数据成员.目标:在构造函数中初始化,然后不管,将const工作在这里
- 调试size_t不能作为数据成员工作的原因
- 类成员函数正常工作,但当作为另一个类的数据成员调用时陷入无限循环