Has*_*een 3 c++ memory-leaks smart-pointers parameter-passing shared-ptr
我看了一些关于 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();
}
Run Code Online (Sandbox Code Playgroud)
问题:
1- 自定义删除器是否必须带有对象数组?
2- 如何将参数传递给默认构造函数以外的构造函数?
3- 自定义删除器可以是免费功能还是会员功能?(不是拉姆达)。
注意:
1- 编译器标志: -std=gnu++11 -fext-numeric-literals -std=c++11 -std=c++14 "-D MS_STDLIB_BUGS=0"
2- G++ 和代码块上的 MinGW64。
3- 但是,我有兴趣大致了解这一点。
1- 自定义删除器是否必须包含对象数组?
从 C++17 开始,如果为std::shared_ptr指定正确的模板参数类型,则为否。
使用 delete-expression
delete ptrif T is not an array type; delete[] ptr if T is an array type (since C++17)作为删除器。
在 C++17 之前,您已经指定了一个自定义删除器(可能使用std::default_delete)。
2- 如何将参数传递给默认构造函数以外的构造函数?
从 C++20 开始,您可以通过std::make_shared实现这一点。
Run Code Online (Sandbox Code Playgroud)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- 自定义删除器可以是免费功能还是会员功能?(不是拉姆达)。
它可以是自由或静态成员函数。