[英]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 *不會在任何地方刪除(或釋放),因此很安全。 如果您嘗試釋放它,則會拋出異常,因為這些文字存儲在與動態內存不同的內存部分中。 在整個過程的生命周期中,文字都是存在的。
該代碼是非法的,因為字符串文字無法初始化char*
。 所以不行。
如果將類型const char*
,則變為合法。 但是,那仍然不安全。
如果可以保證只傳遞字符串文字,那么就可以了,因為可以保證字符串文字在程序運行期間一直存在。 您的課程不會使原義字面被破壞。
但是你不能保證。 您只能將其記錄為前提條件,這確實很薄弱。
這是一個非常糟糕的設計。
此代碼安全嗎?
直接回答:否。由於一些原因,它的設計不佳,但是特別是該類正在使用原始指針並將其保留。
我用來創建實例的文字的壽命是多少?
它們被靜態存儲在任何實現中,因此基本上直到main
結束。
p1實例化后,文字“ John”是否被銷毀
不,它仍然存在,但是沒有任何東西可以引用它了(沒有指針或引用),所以如果沒有一些惡作劇,您將無法重新使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.