我在在线测试中遇到了这段代码。这段代码安全吗?我用来创建实例的文字的生命周期是多少?在实例化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;
}
答案 0 :(得分:2)
char *不会被删除(或免费),所以它是安全的。如果您尝试释放它,则会抛出异常,因为文字存储在动态内存的不同内存部分中。文字在整个过程中都存在。
答案 1 :(得分:2)
代码是非法的,因为字符串文字无法初始化char*
。所以,没有。
如果您输入const char*
类型,则合法。但是,它仍然不安全。
如果你可以保证只传入一个字符串文字,那很好,因为字符串文字保证在程序的持续时间内存活。你的班级不会让文字被毁掉。
但你无法保证。你只能将它作为一个先决条件来记录,而且它真的很弱。
这是一个非常糟糕的设计。
答案 2 :(得分:1)
这段代码安全吗?
直接回答:不是。由于几个原因设计不佳,但特别是该课程正在采用原始指针并抓住它们。
我用来创建实例的文字的生命周期是什么?
他们会在任何实施中静态存储,所以基本上直到main
结束。
文字" John" p1实例化后被破坏
没有它仍然存在,但没有任何东西引用它(没有指针或参考)所以你不能在没有一些恶作剧的情况下回到它。