簡體   English   中英

C++ | 臨時指針生命周期

[英]C++ | temporary pointers lifetime

我正在研究 C++ 並且在我所有的“實驗”中,我試圖了解臨時對象(右值)的生命周期。

我的問題是:

擁有一個包含 const char* 指針的 object,當我想使用以“const char*”作為參數的構造函數時會發生什么? 通常臨時對象會自動銷毀,但是以這種方式創建的指針會發生什么?

我暫時不使用 std::string 或其他 c++11 類,因為我只專注於理解右值。

下面的一個例子:

class MyAwesomeClass {

private:
    const char* data;

public:
    MyAwesomeClass(const char* ptr) {

        this->data = ptr;
    }

    MyAwesomeClass(MyAwesomeClass&& myAwesomeClassRVALUE) {

        this->data = myAwesomeClassRVALUE.data;
        myAwesomeClassRVALUE.data = nullptr;
    }

    ~MyAwesomeClass() {

        delete data;
    }
};

int main() {

    MyAwesomeClass s = "My Awesome Class' string data.";

    return 0;
}

通常臨時對象會自動銷毀,但是以這種方式創建的指針會發生什么?

指針本身就是對象。 與所有其他臨時對象一樣,臨時指針對象也會發生同樣的事情。

您的示例刪除了指向字符串文字的指針,因此程序的行為未定義。 class 也會有一個損壞的賦值運算符,即使它通過將指針傳遞給使用new[]分配的數組來正確使用。

至於右值,我能找到的示例中唯一的右值表達式是nullptr

請注意,此答案基於對問題的先前編輯,其中MyAwesomeClassString class。

您的String class 並不是真正的字符串 class 因為它不擁有基礎字符串數據。 它更類似於std::string_view

我可以看到你有兩種途徑可以追求:

  1. 您的 class 擁有基礎數據。 在這種情況下,class 是std::string的包裝器,並且具有 std::string data member. Look up composition. No need to worry about lifetime as data member. Look up composition. No need to worry about lifetime as data member. Look up composition. No need to worry about lifetime as std::string` 表現良好。

  2. 您的 class 就像指向另一個字符串的“指針/參考/視圖”。 在這種情況下,您有一個const char*可能還有std::size_t大小數據成員。 你基本上有一個std::string_view (除了設計std::string_view的智慧、專業知識和經驗)。 由於您不擁有基礎數據,因此您無法對基礎數據的生命周期做任何事情。 class 的用戶必須確保它不會以過期 object 的“YourStringView”結尾,就像他/她需要確保它不會以指向過期 ZA8CFDE6331BD49EB216Z6F96 的引用/指針結尾一樣

這兩種場景的語義大相徑庭(作為 object 和指向對象的指針之間的區別)。


無論如何,我不建議您這樣做,除非出於學習原因。 std::string_view已經存在,所以只需使用它。 如果您想要打印功能,請使用fmt 庫或 C++ 格式庫(基於提到的 fmt 庫)。

即使您出於學習目的決定這樣做,我也強烈建議您研究這些替代方案並從它們的做事方式中學習。


 MyAwesomeClass(const char* ptr) { this->data = ptr; } ~MyAwesomeClass() { delete data; }

哦不不不不! 不!!

請查看RAII0/3/5的規則。 您的 class 要么擁有尖銳的 object,要么不擁有。 如果它擁有它,那么它負責創建和刪除它。 如果沒有,那么它也做不到。 你不能有“一半的責任”,你負責刪除它但不負責創建它。

在用戶代碼中,您永遠不需要手動管理 memory。 使用 0 規則。

快速回答是您的 class 不擁有數據,而只是原始指針。 在某些情況下,您會看到刪除運算符出現問題。 原始指針不是確保正確 object 所有權的好工具。

暫無
暫無

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

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