使用指针时未初始化的对象

时间:2015-12-11 04:25:15

标签: c++

我正在尝试使用指针 - 你知道实验。

如果删除名称和解引用的指针,我的代码将正常工作 this->name。但我真的不会学习任何东西。

// 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;
}

一切正常 - 有道理,名字是指针,我在set_dog_breed()中取消引用名称并更改其价值。

string get_dog_name()
{
    return *this->name;
}

原因

  29:23:警告:&#39;狗狗&#39;可以在此功能中使用未初始化   [-Wmaybe-未初始化]

     35:9:注意:&#39;狗狗&#39;在这里宣布

好的小狗是没有初始化的,但是当我没有使用指针时,编译器并不介意 - 我不清楚为什么要这样做,或者即使这是实际问题。

2 个答案:

答案 0 :(得分:1)

警告消息正确,doggies对象 未初始化,您永远不会初始化必须在构造函数中完成的成员变量。

由于您没有初始化对象,因此成员变量name将具有 indeterminate 值,并以任何方式使用该变量,除了初始化它将导致未定义的行为

编译器不会阻止你做坏事,它可能会检测到它们,但它不需要对它做任何事情。而且C ++也没有任何类型的运行时检查,编译器和运行时系统会很乐意让你自己开枪。

此外,如果您主要使用取消引用运算符来访问指针,那么您可能首先不需要指针。

答案 1 :(得分:0)

成员string *name没有为其分配内存。因此,您在set_dog_name内会遇到细分错误,您可以在其中为其指定另一个string

此外,您不会在类中或构造函数中初始化成员。这可能是编译器指出的。但是,GCC 5.2不会显示-Wall-Wextra的警告或错误。我在运行程序时遇到分段错误。现场演示here

<强>除了: 初始化全局dogsbreed数组绝不是struct的关注点。相反,您可以将变量设为struct的{​​{3}}并单独初始化。

struct dog {
static string dogsbreed[3];
};

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