用字符串字面值初始化char *类成员
Initializing char * class member with string literal
我在一次在线测试中遇到了这段代码。这个代码安全吗?我用来创建实例的字面量的生命周期是多长?在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"是否被销毁
不,它仍然在那里,但没有任何指向它的东西(没有指针或引用),所以你不能在没有一些诡计的情况下返回它。
相关文章:
- 具有结构成员char数组的sscanf
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- 获取"rw_ssid"中成员"长度"的错误请求,该成员属于非类类型"char*"
- 没有'str'成员在 GCC 和 Clang 'std::basic_ostream<char>',但 MSVC 没有问题
- 使用 const char* 初始化 const ref 字符串成员时幕后会发生什么
- 成员引用基类型 'char' 不是 C++ 中的结构或联合
- 错误:请求成员 .. 是非类类型"char"
- 在C++中,从构造函数中将字符串文本分配给成员const char*变量时会发生什么
- 请求成员 'begin' in 'c' 中,它是非类类型 'char [101]' sort(c.begin(), c
- 如何初始化类的 char 成员变量?
- 将const char * const参数成员分配给新值
- 如何在班级成员中初始"static const char * []"?[C++]
- 返回类型 char* 的成员函数返回在 while 循环后包含不同字符串的地址
- 为什么 const char 数组成员的初始化在构造函数初始值设定项中不兼容
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 无法使用类型 'const char [X]' 的左值初始化类型 'const signed char *' 的成员子对象
- "static const char array"可以在 C 语言上包含变量成员吗
- C++ char* 作为类成员
- 如何将STD :: String的值复制到Char数组类型的结构成员
- 崩溃,如果使用向量删除了一个嵌入式容器的destructor中删除char*成员