【发布时间】:2019-12-10 04:23:33
【问题描述】:
也许我误解了c++中智能指针的某些方面,但是在执行这段代码之后:
class cls
{
public:
class deleter
{
public:
const cls& obj;
deleter(const cls& c) : obj(c) {}
void operator()(int* num)
{
std::cout << "deleter was called" << std::endl;
if (num)
{
std::cout << "num in deleter: " << *num << std::endl;
if (*num == *obj.int_ptr)
{
std::cout << "equal " << *num << " = " << *obj.int_ptr << std::endl;
delete num;
}
else
std::cout << "not equal" << std::endl;
}
}
};
std::shared_ptr<int> int_ptr;
cls() : int_ptr(nullptr,deleter(*this)) {}
};
int main()
{
cls obj;
obj.int_ptr.reset(new int{15});
return 0;
}
输出:
deleter was called
0
我注意到 shared_ptr 中的 reset() 删除了自定义删除器,该删除器在其构造函数中传递给它。相反,unique_ptr 没有表现出这种行为,这对我来说似乎很奇怪。
那么这里发生了什么?
【问题讨论】:
-
这与 STL 无关。
-
@curiousguy
std::shared_ptrAPI 不是 STL 的一部分? -
@Spongman 绝对不是! STL(标准模板库)的定义很松散,但它主要涉及容器和迭代器以及使用迭代器的算法,以及专门设计用于与它们一起工作的东西——而不是一般用途的构建块。因此,尽管 STL 领域的边界定义不明确,但
std::shared_ptr没有任何特征可以使其成为 STL 的一部分。
标签: c++ c++11 shared-ptr