因此如下调用在编译期是合法的:
((A*)nullptr)->Func();
而如果成员函数A::Func()没有访问A的非静态成员变量,这段代码甚至能正确运行,如:
class Test
{
public:
void Say()
{
std::cout << "Say Test" << std::endl;
}
void Set(int data)
{
_data = data;
}
private:
int _data;
};
int main()
{
// 运行成功
((Test*)nullptr)->Say();
// 运行会崩掉,尝试访问空指针所指内存(_data)
((Test*)nullptr)->Set(1);
return 0;
}
正因为这种特性,有时候在成员函数中纠结半天,也不会注意到这个对象已经”不正常了”,被释放掉了。
四. shared_ptr 使用总结
尽量不要环引用或自引用,可通过weak_ptr来避免环引用:owner持有child的shared_ptr child持有owner的weak_ptr
如果存在环引用或自引用,记得在释放时解开这个引用链
对于通过智能指针管理的类,在类中通过shared_from_this()而不是this来传递本身
在类释放时,尽量手动置空其所有的shared_ptr成员,包括function
注:相关教程知识阅读请移步到C++教程频道。










