std::shared_ptr

std::share_ptr 允许多个指针执行同一个对象

当指向对象的最后一个shared_ptr被销毁时,share_ptr类会自动销毁此对象。

class Simple {
public:
    Simple(int param = 0) {
        number = param;
        std::cout << "Simple: " << number << std::endl; 
    }

    ~Simple() {
        std::cout << "~Simple: " << number << std::endl;
    }

    void PrintSomething() {
        std::cout << "PrintSomething: " << info_extend.c_str() << std::endl;
    }

public:
    std::string info_extend;
    int number;
};

void Test()
{
    std::shared_ptr p1 = make_shared(123);
    p1->info_extend  = "abc";

    printf("shardcount = %d\n",p1.use_count());

    std::shared_ptr p2 = p1;

    printf("shardcount = %d\n",p1.use_count());
    printf("shardcount = %d\n",p2.use_count());

    p1->PrintSomething();
    p2->PrintSomething();

    // 删除p1的引用
    p1.reset();

    printf("shardcount = %d\n",p1.use_count());
    printf("shardcount = %d\n",p2.use_count());

    p2->PrintSomething();

}

std::shared_ptr自身拷贝

void process(std::shared_ptr ptr)
{
    // 形参传递,拷贝一个std::shared_ptr user_count()会变成2
    // 当函数退出后, 局部std::shared_ptr变量会销毁掉
    printf("shardcount = %d\n",ptr.use_count()); //  2
}

void Test()
{
    std::shared_ptr p1 = make_shared(123);
    p1->info_extend  = "abc";

    printf("shardcount = %d\n",p1.use_count()); // 1

    process(p1);

    printf("shardcount = %d\n",p1.use_count()); // 1
}

普通指针和智能指针

void process(std::shared_ptr ptr)
{

}

int main()
{

    int *x = new int(2);
    //process(x); // 错误,int* 不能装换为std::shared_ptr

    process(std::shared_ptr(x)); // 合法, 但是内存会被释放,表达式临时对象

    int j = *x; // x是一个悬空指针
    cout << j << endl; // 不能打印出 2

    return 0;
}

不要用.get()初始化另一个智能指针或为智能指针赋值

get用来将指针的访问权限传递给代码,你只有在确定代码不会调用delete指针的情况下,才能使用get。特别是,永远不要用get初始化另一个智能指针或者为另一个智能指针赋值。

void process(std::shared_ptr<int> ptr)
{
}

int main()
{
    std::shared_ptr<int> p1(new int(2));

    process(std::shared_ptr<int>(p1.get())); // 错误

    return 0;
}

注意使用get()返回的内置智能后,需要判断是否还有效

std::shared_ptr<int> p1(new int(100));

auto p = p1.get();

cout << *p << endl; // 100

cout << p1.use_count() << endl; // 1

p1.reset();

cout << p1.use_count() << endl; //0 

cout << *p << endl; // p 指向 无效的地址, 打印无效的值

不要delete 内置指针

void func()
{
    std::shared_ptr<int> p1(new int(100));

    auto p = p1.get();

    cout << *p << endl; // 100

    cout << p1.use_count() << endl; // 1

    delete p;

    cout << "func endl" << endl;
}


std::shared_ptr 环问题的内存泄漏,参考如下
http://blog.csdn.net/shanno/article/details/7363480

你可能感兴趣的:(C++)