在智能指针中存储数组类型时是否明确要求提供删除器?
Is providing a deleter explicitly required when storing array types inside smart pointers?
根据 this paper,开发人员常犯的错误之一 (#3) 是使用具有数组类型的智能指针;主要是因为运算符delete
会被调用而不是delete[]
,导致程序内存泄漏
尽管如此;查找 default deleter in the C++ reference,有以下代码:
#include <memory>
#include <vector>
#include <algorithm>
int main()
{
// {
// std::shared_ptr<int> shared_bad(new int[10]);
// } // the destructor calls delete, undefined behavior
{
std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
} // the destructor calls delete[], ok
{
std::unique_ptr<int> ptr(new int(5));
} // unique_ptr<int> uses default_delete<int>
{
std::unique_ptr<int[]> ptr(new int[10]);
} // unique_ptr<int[]> uses default_delete<int[]>
// default_delete can be used anywhere a delete functor is needed
std::vector<int*> v;
for(int n = 0; n < 100; ++n)
v.push_back(new int(n));
std::for_each(v.begin(), v.end(), std::default_delete<int>());
}
与此直接矛盾;但这可能是因为不同的 C++ 标准;是这样吗,还是论文中的#3 根本不真实?
在使用带有智能指针的数组时是否需要显式提供删除器,或者它是否取决于 c++ 标准(例如 C++11 或 c++17 中的不同行为;c++20);或平台(例如 gcc、MSVC 等)?
如果我没理解错的话,你好像认为例4与论文相矛盾,论文推荐使用例2,这不是论文的意思
示例 1 是未定义的行为,如论文中所述:“对数组使用智能指针,例如 auto_ptr、unique_ptr、shared_ptr 也是不正确的。”。 =12=]
示例 2 工作正常,但是论文中根本没有提到使用自定义删除器。
示例 3 创建指向单个 int
的指针。与论文无关
示例 4 创建指向 int[]
的指针,该指针在论文中作为有效用法提到:“如果数组需要使用智能指针,则可以使用 --a unique_ptr 专业化。
根据 this paper,开发人员常犯的错误之一 (#3) 是使用具有数组类型的智能指针;主要是因为运算符delete
会被调用而不是delete[]
,导致程序内存泄漏
尽管如此;查找 default deleter in the C++ reference,有以下代码:
#include <memory>
#include <vector>
#include <algorithm>
int main()
{
// {
// std::shared_ptr<int> shared_bad(new int[10]);
// } // the destructor calls delete, undefined behavior
{
std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
} // the destructor calls delete[], ok
{
std::unique_ptr<int> ptr(new int(5));
} // unique_ptr<int> uses default_delete<int>
{
std::unique_ptr<int[]> ptr(new int[10]);
} // unique_ptr<int[]> uses default_delete<int[]>
// default_delete can be used anywhere a delete functor is needed
std::vector<int*> v;
for(int n = 0; n < 100; ++n)
v.push_back(new int(n));
std::for_each(v.begin(), v.end(), std::default_delete<int>());
}
与此直接矛盾;但这可能是因为不同的 C++ 标准;是这样吗,还是论文中的#3 根本不真实?
在使用带有智能指针的数组时是否需要显式提供删除器,或者它是否取决于 c++ 标准(例如 C++11 或 c++17 中的不同行为;c++20);或平台(例如 gcc、MSVC 等)?
如果我没理解错的话,你好像认为例4与论文相矛盾,论文推荐使用例2,这不是论文的意思
示例 1 是未定义的行为,如论文中所述:“对数组使用智能指针,例如 auto_ptr、unique_ptr、shared_ptr 也是不正确的。”。 =12=]
示例 2 工作正常,但是论文中根本没有提到使用自定义删除器。
示例 3 创建指向单个 int
的指针。与论文无关
示例 4 创建指向 int[]
的指针,该指针在论文中作为有效用法提到:“如果数组需要使用智能指针,则可以使用 --a unique_ptr