如何使用智能指针正确销毁c ++类

时间:2019-05-23 09:06:47

标签: c++ destructor smart-pointers

我知道基本上只有在使用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;
}

2 个答案:

答案 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的析构函数将自动销毁。顺便说一句,您的类具有指针语义,即两个实例可能共享相同的内存,这可能是不希望的。