考虑以下代码:

#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在被销毁后不再拥有所有权确实是合理的,在销毁期间问这个问题有点奇怪。

09-11 10:07