簡體   English   中英

用std :: shared_ptr分配類成員

[英]Allocating class member with std::shared_ptr

我的假設是,在下面的示例中,一旦A實例超出func()的范圍,對b引用的內存將進行重新分配,對嗎?

class A{
public:
   A() {
        b = std::shared_ptr<char>(new char[100] { 0 } );
   }
   char* b;
}

void func {
   A a;
}

不,不正確。 b的類型為char *並為其分配了shared_ptr<char> 您應該得到一個編譯錯誤。

此外,構造函數是private ,這是另一個編譯錯誤。

以及如何在func()訪問b 它在A是私有A

顯然您的鍛煉還不完整...所以我只是從您提供的內容出發。

另外,我建議使用unique_ptr ,以防您可以說這是唯一所有權(在我看來這是唯一的)。

這樣編譯:

#include <memory>
#include <iostream>

class A {
public:

    A() {
        std::cout << "A created with unique pointer" << std::endl;
        b = std::unique_ptr<char>(new char[100] {
            0
        });
    }

    ~A() {
        std::cout << "A destroyed" << std::endl;
    }

private:
    std::unique_ptr<char> b;
};

void func() {
    A a;
}

int main() {
    std::cout << "Call func()" << std::endl;
    func();
    std::cout << "func() called" << std::endl;
    return 0;
}

並且在func()的末尾銷毀了A並且銷毀了unique_ptr

但是,問問自己是否真的需要使用指針? 在您的情況下,自動變量應該就可以了; 它執行相同的操作(即當func()退出時被銷毀。

您正在分配給char*成員,因此,我很確定在分配完成后就將對shared_ptr進行清理(因為它沒有存儲到其他保持引用計數的shared_ptr中)。

如果要使用shared_ptr ,則必須始終使用它們。 原始指針類成員無法為您管理任何事情。 指針仍然初始化為分配內存的位置,但是不再分配。 即使在構造函數中稍后訪問它,也將是未定義的行為/釋放后使用的錯誤。

無論如何,這是不安全的, 因為默認的shared_ptr使用delete而不是delete[] 是否有某種原因不能使用std::shared_ptr<std::array<char, 100>>

暫無
暫無

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

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