考虑以下代码:
#include <iostream>
#include <memory>
using namespace std;
class T;
std::weak_ptr<T> wptr;
class T
{
public:
T() { }
~T() {
std::cout << "in dtor" << std::endl;
std::cout << (wptr.expired() ? "expired" : "not expired") << std::endl;
}
};
int main() {
{
auto ptr = std::make_shared<T>();
wptr = ptr;
std::cout << (wptr.expired() ? "expired" : "not expired") << std::endl;
}
return 0;
}
在这段代码中,我试图找出
weak_ptr
在对象销毁阶段是否已过期。好像是输出为:not expired
in dtor
expired
我将gcc-5.1与ideone一起使用。
现在,我有另一个问题。我找不到任何说明这是标准行为的文档。是否保证以这种方式工作,总是?
最佳答案
不会。确实,它是LWG issue 2751提出的标准中未指定的内容。
上面链接的~shared_ptr()
的当前用语仅说明已调用删除程序,但非规范性的说明共享所有权的实例数量有所减少。
尽管意图是在调用删除程序时使用weak.expired()
,但依靠它还是值得怀疑的。确信声明shared_ptr
在被销毁后不再拥有所有权确实是合理的,在销毁期间问这个问题有点奇怪。