使用指针时未初始化对象
Un-Initialized object when using pointers
我正在尝试使用指针——你知道的,实验。
如果我删除name的指针和CCD_ 1。但我真的不会学到任何东西。
// Example program
#include <iostream>
#include <string>
using namespace std;
string dogsbreed[3];
struct dog
{
string *name;
string breed;
int age;
void set_dogs_breed()
{
dogsbreed[0] = "Collie";
dogsbreed[1] = "Poodle";
dogsbreed[2] = "Pit Ball";
}
void set_dog_name(string names)
{
*this->name = names;
}
string get_dog_name()
{
return *this->name;
}
};
int main()
{
dog doggies;
doggies.set_dogs_breed();
doggies.set_dog_name("Socks");
doggies.get_dog_name();
}
关于
void set_dog_name(string names)
{
*this->name = names;
}
一切都很好——有道理,name是一个指针,我在set_dog_breed()
中取消引用name并更改它的值。
string get_dog_name()
{
return *this->name;
}
导致
29:23:警告:"doggies"可能在未初始化的情况下在此函数中使用[-W可能未初始化]
35:9:注:此处声明了"doggies"
OK doggies是未初始化的,但编译器并不介意我不使用指针——我不清楚为什么需要这样做,甚至不清楚这是否是实际问题。
警告消息正确,doggies
对象未初始化,您永远不会初始化必须在构造函数中完成的成员变量。
由于您没有初始化对象,成员变量name
将有一个不确定的值,并且以任何方式使用该变量(除了初始化它)都将导致未定义的行为。
编译器不会阻止你做坏事,它可能会检测到它们,但不需要对此采取任何措施。C++也没有任何运行时检查,编译器和运行时系统会很乐意让你开枪自杀。
此外,如果您主要使用解引用运算符来访问指针,那么您可能根本不需要指针。
成员string *name
没有为其分配内存。因此,您会在set_dog_name
内部遇到分段错误,您会为其分配另一个string
。
此外,您既不在类中也不在构造函数中初始化成员。这也许是编译器指出的。但是,GCC 5.2没有显示任何警告或错误,同时显示-Wall
和-Wextra
。我只是在运行程序时遇到了分段错误。现场演示。
旁白:初始化全局this->name
0数组决不是struct
关心的问题。相反,您可以将该变量作为struct
的静态成员,并单独初始化它。
struct dog {
static string dogsbreed[3];
};
string dog::dogsbreed[3] = { "Collie", "Poodle", "Pit Ball" } ;
相关文章:
- C++使用整数的压缩数组初始化对象
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 在 c++ 中初始化对象
- C++ 手动分配和初始化对象
- 使用运算符"="在C++中用值初始化对象
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 如何初始化对象数组?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在线程中初始化对象,然后在其他地方使用它?
- 在没有默认构造函数时使用垃圾数据初始化对象
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 在 c++ 中复制对未初始化对象的引用
- 在成员变量在另一个文件中发生更改后,调用与初始化对象分开的函数
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 当您通过分配初始化C 对象时会发生什么
- 获取未初始化对象成员的地址是否定义良好?