将shared_ptr与对象数组一起使用

时间:2018-04-20 02:50:29

标签: c++ memory-leaks parameter-passing shared-ptr smart-pointers

我看了一些关于C ++共享指针的教程,我有一些问题,我试图在互联网上找到答案而没有运气。

请考虑以下代码:

class A{
    int v,u;
public:
    A(){}
    A(int p1, int p2): v(p1), u(p2) {}
    ~A(){};
};

void f()
{
    shared_ptr<A> c(new A[5]);
    // Is it correct that this causes a memory leak because...
    //... the default deleter only deletes c[0] ?
    // If yes, is this still true for C++17 and C++20 ?

    shared_ptr<A> d(new A[5], [](A* ptr){ delete [] ptr;});
    // how to pass non-default constructor argument in this case ?
}

int main(){
    f();
}

问题:
1-自定义删除器是否必须包含对象数组? 2-如何将参数传递给默认值以外的构造函数? 3-自定义删除器可以是免费还是成员功能? (不是lambda)。

注意:
1-编译器标志:-std=gnu++11 -fext-numeric-literals -std=c++11 -std=c++14 "-D MS_STDLIB_BUGS=0"
代码块上带有MinGW64的2- G ++ 3-但是,我有兴趣知道这一点。

1 个答案:

答案 0 :(得分:3)

  

1-自定义删除器是否必须包含对象数组?

自C ++ 17以来没有,如果为std::shared_ptr指定了正确的模板参数类型。

  

使用delete-expression delete ptr if T is not an array type; delete[] ptr if T is an array type (since C++17)作为删除者。

在C ++ 17之前,您已指定自定义删除器(可能使用std::default_delete)。

  

2-如何将参数传递给默认值以外的构造函数?

你可以通过std::make_shared实现这一目标,因为C ++ 20。

template<class T> shared_ptr<T> make_shared(std::size_t N, const std::remove_extent_t<T>& u); 
(4)   (since C++20)  (T is U[])

template<class T> shared_ptr<T> make_shared(const std::remove_extent_t<T>& u); 
(5)   (since C++20)  (T is U[N])
     

每个元素都是从默认值u。

初始化的

或者像new A[5] { A{0, 0}, A{1, 1}, ...}一样手动操作。

  

3-自定义删除器可以是免费还是成员函数? (不是lambda)。

它可以是免费或静态成员函数。