智能指针 shared_ptr
有引用计数,故会出现循环依赖问题。
#include <iostream>
#include <memory> // 智能指针头文件引入
class Person {
public:
~Person() {
std::cout << "this is ~Person(). " << std::endl;
}
};
int main() {
// 堆区开辟
Person * p1 = new Person();
Person * p2 = new Person();
// 之前 如果忘记了,就没法释放
// delete p1;
// delete p2;
// 现在 智能指针
std::shared_ptr<Person> sharedPtr1(p1);
std::shared_ptr<Person> sharedPtr2(p2);
std::cout << "sharedPtr1引用次数: " << sharedPtr1.use_count() << std::endl; // 1
std::cout << "sharedPtr2引用次数: " << sharedPtr1.use_count() << std::endl; // 1
return 0;
}
循环引用问题
#include <iostream>
#include <memory> // 智能指针头文件引入
class Person2;
class Person1 {
public:
std::shared_ptr<Person2> person2;
~Person1() {
std::cout << "this is ~Person1(). " << std::endl;
}
};
class Person2 {
public:
std::shared_ptr<Person1> person1;
~Person2() {
std::cout << "this is ~Person2(). " << std::endl;
}
};
int main() {
// 堆区开辟
Person1 * p1 = new Person1();
Person2 * p2 = new Person2();
std::shared_ptr<Person1> sharedPtr1(p1);
std::shared_ptr<Person2> sharedPtr2(p2);
std::cout << "sharedPtr1引用次数: " << sharedPtr1.use_count() << std::endl; // 1
std::cout << "sharedPtr2引用次数: " << sharedPtr1.use_count() << std::endl; // 1
// 智能指针赋值
p1->person2 = sharedPtr2;
p2->person1 = sharedPtr1;
std::cout << "sharedPtr1引用次数: " << sharedPtr1.use_count() << std::endl; // 2
std::cout << "sharedPtr2引用次数: " << sharedPtr1.use_count() << std::endl; // 2
return 0;
}
智能指针 weak_ptr
没有引用计数,故不会出现循环依赖问题。
#include <iostream>
#include <memory> // 智能指针头文件引入
class Person2;
class Person1 {
public:
std::weak_ptr<Person2> person2;
~Person1() {
std::cout << "this is ~Person1(). " << std::endl;
}
};
class Person2 {
public:
std::weak_ptr<Person1> person1;
~Person2() {
std::cout << "this is ~Person2(). " << std::endl;
}
};
int main() {
// 堆区开辟
Person1 * p1 = new Person1();
Person2 * p2 = new Person2();
std::shared_ptr<Person1> sharedPtr1(p1);
std::shared_ptr<Person2> sharedPtr2(p2);
std::cout << "sharedPtr1引用次数: " << sharedPtr1.use_count() << std::endl; // 1
std::cout << "sharedPtr2引用次数: " << sharedPtr1.use_count() << std::endl; // 1
// 智能指针赋值
p1->person2 = sharedPtr2;
p2->person1 = sharedPtr1;
std::cout << "sharedPtr1引用次数: " << sharedPtr1.use_count() << std::endl; // 1
std::cout << "sharedPtr2引用次数: " << sharedPtr1.use_count() << std::endl; // 1
return 0;
}
智能指针 unique_ptr
#include <iostream>
#include <memory> // 智能指针头文件引入
class Person {
public:
~Person() {
std::cout << "this is ~Person(). " << std::endl;
}
};
int main() {
// 堆区开辟
Person * p1 = new Person();
Person * p2 = new Person();
std::unique_ptr<Person> uniquePtr1(p1);
std::unique_ptr<Person> uniquePtr2(p2);
// 不允许,报错
// std::unique_ptr<Person> uniquePtr3 = uniquePtr2;
return 0;
}