我在 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;
}
这将打印/保存已删除的对象的数据成员,而不会报告任何类型的错误。
请写在:
- 为什么
shared_ptr
pObj 不报告(在运行时)底层对象已被删除? - 由于我正在创建一个 const shared_ptr,意味着不能使用它来引用任何其他对象,为什么在对象删除时不调用 lambda。
weak_ptr
在类似情况下可能会有所帮助。weak_ptr
与对对象的引用的生命周期超过它所引用的对象的语义一起使用。