1. 程式人生 > 其它 >智慧指標傳參

智慧指標傳參

技術標籤:c++

一個奇奇怪怪的測試
shared_ptr進行引用傳遞
引用計數不變,記憶體正常釋放

#include <iostream>
#include <memory>

using namespace std;

class Base
{
public:
    Base(int num = 0):num(num) { cout << "Base::Base()" << endl; }
    ~Base() { cout << "Base::~Base()" <<
endl; } int num; }; void func1(shared_ptr<Base>& sp) { cout << "func1 num: " << sp->num << " count: " << sp.use_count() << endl; sp->num++; } int main() { auto sp = make_shared<Base>(10); func1(sp); cout <<
"main num: " << sp->num << " count: " << sp.use_count() << endl; }

在這裡插入圖片描述

shared_ptr 進行值傳遞(傳入shared_ptr)
引用計數加一,記憶體釋放正常

#include <iostream>
#include <memory>

using namespace std;

class Base
{
public:
    Base(int num = 0):num(num) { cout <<
"Base::Base()" << endl; } ~Base() { cout << "Base::~Base()" << endl; } int num; }; void func1(shared_ptr<Base>& sp) { cout << "func1 num: " << sp->num << " count: " << sp.use_count() << endl; sp->num++; } int main() { auto sp = make_shared<Base>(10); func1(sp); cout << "main num: " << sp->num << " count: " << sp.use_count() << endl; }

在這裡插入圖片描述
shared_ptr進行值傳遞(傳入unique_ptr)
需要使用move轉移所有權

#include <memory>

using namespace std;

class Base
{
public:
    Base(int num = 0):num(num) { cout << "Base::Base()" << endl; }
    ~Base() { cout << "Base::~Base()" << endl; }
    int num;
};

void func1(shared_ptr<Base> sp) {
    cout << "func1 num: " << sp->num << " count: " << sp.use_count() << endl;
    sp->num++;
}

int main()
{
    auto sp = make_unique<Base>(10);
    func1(std::move(sp));
}

在這裡插入圖片描述
傳遞後unique_ptr指標無法使用,如需繼續使用,可以從函式返回

#include <iostream>
#include <memory>

using namespace std;

class Base
{
public:
    Base(int num = 0):num(num) { cout << "Base::Base()" << endl; }
    ~Base() { cout << "Base::~Base()" << endl; }
    int num;
};

auto func1(shared_ptr<Base> sp) {
    cout << "func1 num: " << sp->num << " count: " << sp.use_count() << endl;
    sp->num++;
    return sp;
}

int main()
{
    auto up = make_unique<Base>(10);
    auto sp = func1(std::move(up));
    cout << "main num: " << sp->num << " count: " << sp.use_count() << endl;
}

在這裡插入圖片描述