【发布时间】:2017-06-10 15:06:00
【问题描述】:
考虑以下代码:
#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_ptrs 是否在对象销毁阶段过期。似乎是这样。输出是:
not expired
in dtor
expired
我使用 gcc-5.1 和 ideone。
现在,我有另一个问题。我找不到任何说明这是标准行为的文档。是否保证以这种方式工作,总是?
【问题讨论】:
-
独立于规范,我认为它必须在析构函数中过期。如果您能够将其转换为
shared_ptr,那么您将拥有无法阻止对象死亡的shared_ptr。 -
@T.C.我不认为程序说
wptr.lock是不合理的,而不同的线程可能会或可能不会破坏被监视的对象(它运行对象的析构函数)。这是一个主要的用例,他们似乎在说这是“不合理的”。看来我误会了? -
@T.C.,这是答案之一中没有的有价值的信息。您想将此扩展为答案吗?
-
我没有编辑问题文本。我重新标记了它,因为它显然是在要求提供保证的答案。我知道一些对此有更多了解的人会发现问题是否被标记为语言律师,而他们不会费心去查看 C++。希望OP本人/她自己澄清一下。
标签: c++ c++11 c++14 shared-ptr weak-ptr