boost内存管理

#include <boost/smart_ptr.hpp>  
#include <iostream>   

using namespace std;
using namespace boost;


int main()
{
    //shared_ptr 引用计数型的智能指针
    //自由,允许拷贝 赋值,共享
    //可放置在容器中,stl容器中存储指针的最标准解法
    //类似scoped_ptr,重载了* ->  bool判断有效性,get()得到原始指针,没有指针算数操作
    //不可管理new[]产生的动态数组指针,unique_ptr《》  可以

    boost::shared_ptr<int> spi(new int);
    assert(spi); //此时值为内存随机的数;
    cout << "is unique ? " << spi.unique() << endl; //此时为1
    cout << "*spi   (0)" << *spi << endl;
    cout << "value of use_count " << spi.use_count() << endl;
    *spi = 10;
    cout << "is unique() ? " << spi.unique() << endl;
    cout << "*spi   (1)" << *spi << endl;
    cout << "value of use_count " << spi.use_count() << endl;
    //此时引用计数为1,当为0时,就会自动删除;

    boost::shared_ptr<int>   sp2(spi);
    assert(spi == sp2);  //支持比较操作
    cout << "value of use_count " << sp2.use_count() << endl;
    cout << "is unique ? " << spi.unique() << endl; // 此时为0

    sp2.reset();
    cout << "spi" << spi.use_count() << endl;
    cout << "sp2" << sp2.use_count() << endl;
    //sp2 为0,spi 为1
    //reset的作用:将引用计数减为0,停止对指针的共享
    cout << "___" << endl;

    boost::shared_ptr<int>  sp3(spi);
    cout << "sp3" << sp3.use_count() << endl;
    cout << "spi" << spi.use_count() << endl; //此时use_count() 都是2
    //spi 0; sp3 1;
    spi.reset();

    cout << "sp3" << sp3.use_count() << endl;
    cout << "spi" << spi.use_count() << endl;
    system("pause");
    return 0;
}

结果:

is unique ? 1
*spi   (0)-842150451
value of use_count 1
is unique() ? 1
*spi   (1)10
value of use_count 1
value of use_count 2
is unique ? 0
spi1
sp20
___
sp32
spi2
sp31
spi0

一个简单例子:

#include <boost/smart_ptr.hpp>  
#include <iostream>   

using namespace std;
using namespace boost;

class shared
{
private:
    boost::shared_ptr<int> p;
public:
    shared(boost::shared_ptr<int> p_) :p(p_) 
    {
        //cout << "construct  use_count: " << p.use_count() << endl;
    }
    void print()
    {
        cout << "count : " << p.use_count() << "v:=" << *p << endl;
    }

};

void print_func(boost::shared_ptr<int> p) //参数是指针拷贝的方式传参,
{
    cout << "count : " << p.use_count() << "v:=" << *p << endl;
}
int main()
{
    boost::shared_ptr<int> p(new int(10));

    shared s1(p), s2(p);

    s1.print();
    s2.print();

    print_func(p);
    *p = 20;
    print_func(p);
    s1.print();
    system("pause");

    return 0;
}

结果

#include <boost/smart_ptr.hpp>  
#include <iostream>   

using namespace std;
using namespace boost;

class shared
{
private:
    boost::shared_ptr<int> p;
public:
    shared(boost::shared_ptr<int> p_) :p(p_) 
    {
        //cout << "construct  use_count: " << p.use_count() << endl;
    }
    void print()
    {
        cout << "count : " << p.use_count() << "v:=" << *p << endl;
    }

};

void print_func(boost::shared_ptr<int> p) //参数是指针拷贝的方式传参,
{
    cout << "count : " << p.use_count() << "v:=" << *p << endl;
}
int main()
{
    boost::shared_ptr<int> p(new int(10));

    shared s1(p), s2(p);

    s1.print();
    s2.print();

    print_func(p);
    *p = 20;
    print_func(p);
    s1.print();
    system("pause");

    return 0;
}

结果为:

count : 3v:=10
count : 3v:=10
count : 4v:=10
count : 4v:=20
count : 3v:=20

工厂函数make_share<> () ,来避免使用new;

#include <boost/smart_ptr.hpp>  
#include <vector>
#include <iostream>   

using namespace std;
using namespace boost;


int main()
{
    auto sp = boost::make_shared<string>("Leeman");
    auto spv = boost::make_shared<vector<int>>(10, 2);
    assert(spv->size() == 10);
    cout << spv->at(0) << endl;

    system("pause");

    return 0;
}
#include <boost/smart_ptr.hpp>  
#include <vector>
#include <iostream>   

using namespace std;
using namespace boost;


int main()
{
    //shared_ptr 应用于标准容器有两种方式
    //1.将容器作为shared_ptr管理的对象,如shared_ptr<vector<int>>
    //2.将shared_ptr作为容器的元素,scoped_ptr 就不行,没法拷贝和赋值
    typedef vector<boost::shared_ptr<int>>  vs;
    vs v(10);
    int i = 0;
    for (auto pos = v.begin(); pos < v.end(); pos++)
    {
        (*pos) = boost::make_shared<int>(++i);
        cout << **pos << ", ";
    }
    cout << endl;
    boost::shared_ptr<int> p = v[9];
    cout << *v[9] << endl;
    cout << *v[0] << endl;  system("pause");

    return 0;
}

结果为:
指针指向的都是一个对象i,并且不断++,为何最终列表 还是可以生成1 - 10;地址变成10个了???

1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
10
1
#include <boost/smart_ptr.hpp>  
#include <vector>
#include <iostream>   

using namespace std;
using namespace boost;


int main()
{
    int *p = new int[100];
    shared_array<int> sa(p);

    assert(sa.unique());

    shared_array<int> sb(sa);
    assert(sb.use_count() == 2);

    sa[0] = 10;
    assert(sb[0] == 10);
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35508344/article/details/80934171