用字符串字面值初始化char *类成员

Initializing char * class member with string literal

本文关键字:成员 char 初始化 字符串 字面值      更新时间:2023-10-16

我在一次在线测试中遇到了这段代码。这个代码安全吗?我用来创建实例的字面量的生命周期是多长?在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;
}

代码是非法的,因为字符串字面值不能初始化char*。所以,不。

如果您将类型设置为const char*,则它是合法的。但是,它仍然不安全。

如果可以保证只传递一个字符串字面值,那么这很好,因为字符串字面值可以保证在程序的持续时间内存在。你的类不会使字面量被销毁。

但是你不能保证。您只能将其作为先决条件进行记录,这是非常弱的。

char *没有被删除(或释放),所以它是安全的。如果试图释放它,将会引发异常,因为字面值存储在与动态内存不同的内存部分。

这个代码安全吗?

直接回答:没有。这是一个糟糕的设计,有几个原因,但特别是这个类正在获取原始指针并保留它们。

我用来创建实例的字面量的生命周期是多少?

它们在任何实现中都是静态存储的,所以基本上直到main结束。

在实例化p1后,字面量"John"是否被销毁

不,它仍然在那里,但没有任何指向它的东西(没有指针或引用),所以你不能在没有一些诡计的情况下返回它。