[英]Should I assume an object's destructor is called immediately after removal from STL containers?
[英]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
?
您應該創建一個析構函數來手動拆除您班級管理的所有內容。
但是,這樣做不會阻止其他所有內容的破壞。 析構函數運行后 ,您的成員仍將自動被破壞; 您的析構函數是另外的 。
所以您做對了。
您可以想象一下,析構函數的右大括號還具有對每個成員(和基礎)析構函數的調用,其調用順序與構造相反。
因此,您無需對所有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.