簡體   English   中英

當類同時包裝STL容器和指針時,是否應該在類的析構函數中銷毀STL容器?

[英]Should I destroy STL containers in my class's destructor, when the class wraps both a STL container and a pointer?

我有點理解這樣的事實,當該類的實例超出范圍時,該類的包裝STL容器將被自動銷毀。 因此,當類僅包裝STL容器時,我不必編寫析構函數。 但是,如果該類還必須管理一些指針,該怎么辦?

在某些CUDA開發中,我想要一個類來處理設備指針和STL容器。

class Image{
    private:
        float *data_device;
        std::array<int, 2> shape;
    public:
        // some constructors and methods
        ~Image(){
            cudaFree(data_device);
            // what to do with the STL array?
        }
};

在上述情況下,我需要析構函數為data_device釋放內存。 但是我應該處理STL數組嗎? 如果是這樣,我如何正確地破壞shape

但是我應該處理STL數組嗎?

不,你不應該。

std::array析構函數自動銷毀std::array每個元素。

您應該創建一個析構函數來手動拆除您班級管理的所有內容。

但是,這樣做不會阻止其他所有內容的破壞。 析構函數運行 ,您的成員仍將自動被破壞; 您的析構函數是另外的

所以您做對了。

您可以想象一下,析構函數的右大括號還具有對每個成員(和基礎)析構函數的調用,其調用順序與構造相反。

因此,您無需對所有std容器都正確設計的成員做任何額外的事情。 但是,讓我們備份一下。

但是,如果該類還必須管理一些指針,該怎么辦?

您不應編寫此類。 取而代之的是,您使用一個類的唯一任務是完全管理一個指針,以替代“某些指針”。 另外,您現在不必擔心雙重釋放,因為Image沒有默認的副本構造函數

// cuda Deleter for std::unique_ptr
struct CudaFree
{
    void operator()(float * ptr) { cudaFree(ptr); }
}

class Image{
    private:
        std::unique_ptr<float, CudaFree> data_device;
        std::array<int, 2> shape;
    public:
        Image(/* ? */)
          : data_device(cudaAlloc()/* ? */), 
            shape(/* ? */) 
        {/* ? */}
        // similarly other constructors
        // other members
        // implicit destructor does the right thing
};

暫無
暫無

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

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