我知道基本上只有在使用new分配某些内容时才需要删除。但是,我不确定如何释放智能指针以及那些包含智能指针作为其成员的类。那么,如何在以下类中正确实现析构函数?
template <typename T>
class Array {
public:
Array(const unsigned int length){
T* ptr = (T*)malloc(sizeof(T)*length);
array = std::shared_ptr<T>(
new(ptr) T[length],
[](T* ptr){free(ptr);}
);
}
~Array(){
// Q1 how should I properly implement this destructor?
}
private:
std::shared_ptr<T> array;
};
class Example{
public:
Example(){
...
}
~Example(){
// Q2 how should I properly implement this destructor?
}
private:
Array<float> bufferFloatArray;
Array<float>* bufferFloatArrayPtr;
std::shared_ptr<float> bufferFloatPtr;
}
答案 0 :(得分:2)
智能指针会自动调用其析构函数。因此,您不需要实现~Array()
,但是在Example类中,您使用了原始指针(Array<float>* bufferFloatArrayPtr)
,该原始指针应在~Example()
中适当地释放。
PS请注意,您在Array类实现中犯了一个错误。在delete[] ptr
delete-expression 中使用free(ptr)
代替shared_ptr
,以避免内存泄漏。
答案 1 :(得分:1)
注意:answer的@gimme_danger是指问题的old version。这是new version的答案。
The
T* ptr = (T*)malloc(sizeof(T)*length);
array = std::shared_ptr<T>(
new(ptr) T[length],
[](T* ptr){ /*...*/ }
);
首先使用malloc
分配一些内存,然后使用placement-new语法调用T
的构造函数。您需要在删除器中同时做这两项。
[](T* ptr) {
std::destroy_n(ptr, length);
std::free(ptr);
}
您不需要析构函数。 shared_ptr
的析构函数将自动销毁。顺便说一句,您的类具有指针语义,即两个实例可能共享相同的内存,这可能是不希望的。