gpt4 book ai didi

c++ - shared_ptr 不报告引用对象删除

转载 作者:太空狗 更新时间:2023-10-29 23:22:50 24 4
gpt4 key购买 nike

我在 MS Visual Studio 10 中运行这段代码,

#include <iostream>
#include <memory>
using namespace std;

class A
{
int i;
public:
A(int j) : i(j) {}
~A() {}
void fun()
{
cout << "A::i = " << i << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A aObj(12);
std::shared_ptr<A> const pObj (&aObj,
[] (A* pA) {
cout << "lambda deleter" << endl;
});
aObj.~A();
pObj->fun();
return 0;
}

这会打印/保存对象的数据成员,该对象已被删除,而不会报告任何类型的错误。

请写在:

  1. 为什么 shared_ptr pObj 不报告(在运行时)底层对象已被删除?
  2. 由于我正在创建一个 const shared_ptr,这意味着不能使用它来引用任何其他对象,这就是为什么在删除对象时不调用 lambda 的原因。
  3. weak_ptr 能否在类似情况下提供帮助。 weak_ptr 与对对象的引用的生命周期比它所引用的对象的生命周期更长的语义一起使用。

最佳答案

Why shared_ptr pObj doesn't report (at run-time) that underlying object has already been deleted?

因为 shared_ptr 不是魔法1。仅当它删除该对象 时,它才知道何时删除了包含的对象。当您使用 shared_ptr 时,您已经与 shared_ptr 签订了契约(Contract)。该契约(Contract)的租户之一(实际上,任何您使用任何类型的智能指针签订的契约(Contract))是不能删除该指针。 shared_ptr 实例拥有指针, 将删除它,而不是你。

违反该契约会导致未定义的行为。

Since I'm creating a const shared_ptr, means can't use it to refer any other object, why lambda is not invoked at object deletion.

同样,shared_ptr 只能在 删除包含的对象时知道它已被删除。如果您违约,它对对象的状态一无所知。

Can weak_ptr be helpful in similar cases. weak_ptr is used with semantics that the lifetime of a reference to an object outlives the object it refers to.

weak_ptr 并不比 shared_ptr 更神奇。 weak_ptr 只知道创建它的 shared_ptr 集知道什么。如果 shared_ptr 不知道对象已被删除,weak_ptr 也不会。


1 我所说的“魔法”是指做一些在 C++ 中做不到的事情。如果你想知道一个函数已经被调用(析构函数是一个函数调用),只有两种方法可以做到这一点。要么该函数告诉您它已被调用(通过设置一些您可以看到的值),要么您设置一个系统,人们通过该系统调用您的函数,然后调用另一个函数。

第一个系统需要一个明确编写的函数,让人们知道它已被调用。您不能使用任何旧功能来做到这一点;它必须为此而设计。第二个系统要求每个人都使用你的新功能,没有人使用旧功能。如果有人直接使用旧的,您的代码将不会知道。

第一种方法称为“侵入式”(因为它要求您以特殊方式编写对象),使用它的智能指针称为“侵入式智能指针”。第二种方法是非侵入式的(不需要为对象编写特殊代码)。 shared_ptr 和所有当前标准的智能指针都是非侵入式的。这意味着您可以将它们用于任何对象,但只有在遵守契约(Contract)的情况下才能使用它们。

C++ 不提供第三种方式。因此,一个可以以某种方式侵入析构函数调用的类,一个可以知道它已经被调用而析构函数没有明确告诉它已经被调用的类,是不可能的。因此会很神奇。

关于c++ - shared_ptr 不报告引用对象删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15831153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com