一个奇奇怪怪的测试
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;
}