使用智能指针shared_ptr应该注意的问题

本文展示了一个C++代码示例,涉及智能指针`shared_ptr`的使用,以及`Human`、`HuamanList`、`Target`和`TargetList`类的定义和操作。在`main`函数中创建并管理了`Human`对象,将它们添加到`Target`的`HuamanList`中,并通过`TargetList`进行显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <vector>
#include <memory>
#include <string>

using namespace std;

class Human
{   
    public:
        Human() : t(0.0), m(0.0)
        { 
            cout << "con Human" << endl; 
        }
        ~Human()
        { 
            cout << "des Human" << endl; 
        }

    public:
        double t;
        double m;
};

class HuamanList
{
    public:
	    HuamanList() : m_humanList(new vector<shared_ptr<Human>>)
        { 
            cout << "con HuamanList" << endl; 
        }
	    ~HuamanList()
        { 
            cout << "des HuamanList" << endl; 
        }
    
    public:
	    void addHuman(shared_ptr<Human> human)
        { 
            m_humanList->push_back(human); 
        }
        void show()
        {
            for(auto iter = m_humanList->begin();iter != m_humanList->end();iter++)
            {
                cout << (*iter)->t <<","<< (*iter)->m <<endl;
            }
        }
    
    private:
        shared_ptr<vector<shared_ptr<Human>>> m_humanList;
};

class Target
{
    public:
        Target() : list(new HuamanList), name("myname")
        {
            cout << "con Target" << endl; 
        }
        ~Target()
        {
            cout << "des Target" << endl; 
        }
    
    public:
        string name;
        shared_ptr<HuamanList> list;      
};

class TargetList
{
    public:
	    TargetList() : m_TargetList(new vector<shared_ptr<Target>>)
        { 
            cout << "con TargetList" << endl; 
        }
	    ~TargetList()
        { 
            cout << "des TargetList" << endl; 
        }
    
    public:
	    void addTarget(shared_ptr<Target> Target)
        { 
            m_TargetList->push_back(Target); 
        }
        void show()
        {
            for(auto iter = m_TargetList->begin();iter != m_TargetList->end();iter++)
            {
                cout << (*iter)->name << endl;
            }
        }
    
    private:
        shared_ptr<vector<shared_ptr<Target>>> m_TargetList;
};

int main()
{	
    shared_ptr<TargetList> pTargetList(new TargetList);
    
    //1-------------------------------------
    shared_ptr<Target> pTarget1(new Target);

    shared_ptr<Human> newHuman(new Human);
    newHuman->t = 1.0;
    newHuman->m = 1.0;
    shared_ptr<Human> newHuman2(new Human);
    newHuman2->t = 2.0;
    newHuman2->m = 2.0;
    shared_ptr<Human> newHuman3(new Human);
    newHuman3->t = 3.0;
    newHuman3->m = 3.0;

    pTarget1->list->addHuman(newHuman);
    pTarget1->list->addHuman(newHuman2);
    pTarget1->list->addHuman(newHuman3);
    pTarget1->name = "missile";

    pTargetList->addTarget(pTarget1);
    pTarget1->list->show();

    //2-------------------------------------
    shared_ptr<Target> pTarget2(new Target);

    shared_ptr<Human> newHuman4(new Human);
    newHuman4->t = 4.0;
    newHuman4->m = 4.0;
    shared_ptr<Human> newHuman5(new Human);
    newHuman5->t = 5.0;
    newHuman5->m = 5.0;
    shared_ptr<Human> newHuman6(new Human);
    newHuman6->t = 6.0;
    newHuman6->m = 6.0;

    pTarget2->list->addHuman(newHuman4);
    pTarget2->list->addHuman(newHuman5);
    pTarget2->list->addHuman(newHuman6);
    pTarget2->name = "missile2";

    pTargetList->addTarget(pTarget2);
    pTarget2->list->show();

    //------------------------------
    pTargetList->show();
    
	return 0;
}
// g++ -g .\test.cpp -o exe/test
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值