我发现一些代码使用 std: : share _ ptr 在关机时执行任意清理。起初我认为这个代码不可能工作,但后来我尝试了以下方法:
#include <memory>
#include <iostream>
#include <vector>
class test {
public:
test() {
std::cout << "Test created" << std::endl;
}
~test() {
std::cout << "Test destroyed" << std::endl;
}
};
int main() {
std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr<void>>"
<< std::endl;
std::vector<std::shared_ptr<void>> v;
{
std::cout << "Creating test" << std::endl;
v.push_back( std::shared_ptr<test>( new test() ) );
std::cout << "Leaving scope" << std::endl;
}
std::cout << "Leaving main" << std::endl;
return 0;
}
这个程序给出了输出:
At begin of main.
creating std::vector<std::shared_ptr<void>>
Creating test
Test created
Leaving scope
Leaving main
Test destroyed
我有一些关于为什么这样做的想法,这与在 G + + 中实现的 std: : share _ ptrs 的内部原理有关。由于这些对象将内部指针与计数器包装在一起,所以从 std::shared_ptr<test>
到 std::shared_ptr<void>
的转换可能不会阻碍析构函数的调用。这个假设正确吗?
当然,还有一个更重要的问题: 这是否能够保证按照标准工作,或者对 std: : share _ ptr 的内部进一步更改,其他实现实际上会破坏这段代码?