智慧指標傳參
阿新 • • 發佈:2020-12-10
技術標籤: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;
}