使用字符串文字初始化char *类成员

时间:2015-07-30 23:29:08

标签: c++

我在在线测试中遇到了这段代码。这段代码安全吗?我用来创建实例的文字的生命周期是多少?在实例化p1之后,文字“John”是否被销毁(因为它完成了使用文字的表达式)。

class Person {
    public:

    char *name;
    Person(char *s) { name = s}
    inline void setName(char *newName) {name = newName;}

};

int main(){

    Person p1("John");

    Person p2("Steve");

    p1.setName("Rick"); 
    p2 = p1;
    return 0;

}

3 个答案:

答案 0 :(得分:2)

char *不会被删除(或免费),所以它是安全的。如果您尝试释放它,则会抛出异常,因为文字存储在动态内存的不同内存部分中。文字在整个过程中都存在。

答案 1 :(得分:2)

代码是非法的,因为字符串文字无法初始化char*。所以,没有。

如果您输入const char*类型,则合法。但是,它仍然不安全。

如果你可以保证只传入一个字符串文字,那很好,因为字符串文字保证在程序的持续时间内存活。你的班级不会让文字被毁掉。

但你无法保证。你只能将它作为一个先决条件来记录,而且它真的很弱。

这是一个非常糟糕的设计。

答案 2 :(得分:1)

  

这段代码安全吗?

直接回答:不是。由于几个原因设计不佳,但特别是该课程正在采用原始指针并抓住它们。

  

我用来创建实例的文字的生命周期是什么?

他们会在任何实施中静态存储,所以基本上直到main结束。

  

文字" John" p1实例化后被破坏

没有它仍然存在,但没有任何东西引用它(没有指针或参考)所以你不能在没有一些恶作剧的情况下回到它。