簡體   English   中英

用字符串文字初始化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 *不會在任何地方刪除(或釋放),因此很安全。 如果您嘗試釋放它,則會拋出異常,因為這些文字存儲在與動態內存不同的內存部分中。 在整個過程的生命周期中,文字都是存在的。

該代碼是非法的,因為字符串文字無法初始化char* 所以不行。

如果將類型const char* ,則變為合法。 但是,那仍然不安全。

如果可以保證只傳遞字符串文字,那么就可以了,因為可以保證字符串文字在程序運行期間一直存在。 您的課程不會使原義字面被破壞。

但是你不能保證。 您只能將其記錄為前提條件,這確實很薄弱。

這是一個非常糟糕的設計。

此代碼安全嗎?

直接回答:否。由於一些原因,它的設計不佳,但是特別是該類正在使用原始指針並將其保留。

我用來創建實例的文字的壽命是多少?

它們被靜態存儲在任何實現中,因此基本上直到main結束。

p1實例化后,文字“ John”是否被銷毀

不,它仍然存在,但是沒有任何東西可以引用它了(沒有指針或引用),所以如果沒有一些惡作劇,您將無法重新使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM