为什么用这种方式上课是错的?

时间:2018-03-05 19:32:18

标签: c++11

我被告知如果没有给出解释就创建这样的课程是错误的,花了很多时间后,我无法弄清楚原因。

class Dog {
public:
    Dog (char const* n) : dog_name(n) {}
    ~Dog() {}

    char const* getDogName() const 
    { 
        return dog_name; 
    }

private:
    char const* dog_name;
};

1 个答案:

答案 0 :(得分:1)

使用您的班级考虑以下代码:

char *name = new char[5];
strcpy(name, "Fido");
Dog fido(name);
delete name;
std::cout << fido.getDogName() << '\n'; // Oops -- undefined behavior!

实例fido仍然指向已删除的char数组。这是dangling pointer,导致nasal demons

或另一个问题:

char name[32];
strcpy(name, "Fido");
Dog fido(name);
strcpy(name, "Rover");
Dog rover(name);
std::cout << fido.getDogName() << '\n'; // Why does this print "Rover"?
std::cout << rover.getDogName() << '\n';

这两个实例都指向同一个缓冲区。当你改变它时,它将Fido的名字改为Rover。糟糕。

一种解决方案是在类中创建自己的char缓冲区,而不仅仅是一个指针,并将strcpy数据放入其中(仔细检查范围,这样就不会超出缓冲区!)。或者只是避免所有这些废话,并使用std::string,这更有意义。