使用指针时未初始化对象

Un-Initialized object when using pointers

本文关键字:初始化 对象 指针      更新时间:2023-10-16

我正在尝试使用指针——你知道的,实验。

如果我删除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->name0数组决不是struct关心的问题。相反,您可以将该变量作为struct的静态成员,并单独初始化它。

struct dog {
static string dogsbreed[3];
};
string dog::dogsbreed[3] = { "Collie", "Poodle", "Pit Ball" } ;