Вы можете себе представить, что закрывающая скобка деструктора дополнительно имеет вызовы деструктора каждого члена (и базы), в обратном порядке построения.
Таким образом, вам не нужно ничего делать для правильно сконструированного члена, которым являются все контейнеры std
.Но давайте вернемся немного назад.
Но что, если класс также должен управлять некоторыми указателями?
Вы не должны писать такой класс.Вместо этого вы используете класс, работа которого sole заключается в управлении ровно одним указателем в качестве альтернативы «некоторому указателю».В качестве бонуса вам теперь не нужно беспокоиться о двойном освобождении, потому что 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
};