C++ 当拥有的对象退出作用域时,对类实例成员使用共享的_ptr会正确地清理吗?

C++ 当拥有的对象退出作用域时,对类实例成员使用共享的_ptr会正确地清理吗?,c++,C++,当拥有的父对象退出作用域时,对类实例成员使用共享\u ptr会正确清理新对象吗?比如下面的例子 下面的代码示例-因此,当家庭实例超出范围时,它是否会清理/删除地图中链接的人物对象 如果是,我如何确认这一点?有没有工具我可以用来显示之前和之后-在没有显示person对象之后-如果我放回正常的指针,我仍然可以看到person对象-谢谢 class Family { private: //std::map<int ,Person*> _people; std::map<

当拥有的父对象退出作用域时,对类实例成员使用共享\u ptr会正确清理新对象吗?比如下面的例子

下面的代码示例-因此,当家庭实例超出范围时,它是否会清理/删除地图中链接的人物对象

如果是,我如何确认这一点?有没有工具我可以用来显示之前和之后-在没有显示person对象之后-如果我放回正常的指针,我仍然可以看到person对象-谢谢

class Family
{
private:
    //std::map<int ,Person*> _people;
    std::map<int ,std::tr1::shared_ptr<Person>> _people;

public:
    void AddPerson(int age)
    {
        //_people[age] = new Person(age);
        _people[age] = std::tr1::shared_ptr<Person>( new Person(age));
    }
};

    class Person
    {
    private:
        int _age;
    public: 
        Person(int age)
        {
            _age= age;
        }
        int GetName(){return _age;}
    };
对。shared_ptr是一个引用计数智能指针,它拥有新对象的所有权

当一个家庭被破坏时,它的成员(包括_人地图)将被删除。删除地图时,其内容将被删除

如果_people只是一张包含Person的地图,那么如果其他人不知道,家庭的破坏者将不得不删除每个人

在这个例子中,使用shared_ptr似乎很好。例如,您可以返回一个家庭的儿子的共享ptr,并使他成为另一个家庭的父亲

std::tr1::shared_ptr<Person> getSon(){
      return someOne... ;
}

要使智能指针工作,您需要按值返回,以便调用复制构造函数。然后,您可以安全地删除一个族而不会损坏另一个族。

仔细检查:族超出范围,人被销毁,地图析构函数将删除它的所有元素,这意味着对于每个元素,将调用析构函数。映射中的所有共享\u ptr都会减少其引用计数。如果引用计数现在为0,则对象将被销毁。虽然我不明白为什么要在示例中存储指针smart或not,但我想您有自己的理由

是的。这将按照您的期望和应该的方式进行。std::tr1::shared_ptr可用于STL结构中;另一方面,旧的auto_ptr不能

地图成员\u人将被清理,但人员共享指针不会被清理,除非其中一些人达到refcount 0

甚至不要提及自动\u ptr。没有人想记住它,也没有人反对它。我认为人们问这个问题的唯一原因是他们多年来一直听说smart pointer read auto_ptr和STL不会混合使用。如果有动机让@CodingQuant知道你为什么不喜欢他的问题的人投了反对票,那就太好了。