今天看Qt智能指针,想着来给C++智能指针做个总结。
C++和Qt智能指针基本一样,只是多了个QPointer(指向对象被删除自动置为NULL,防止悬空指针)。
C++智能指针shared_ptr(QSharedPointer)
shared_ptr<类型> :共享指针,可以使用多个指针指向同一个对象,并且自带引用计数法(几个指针指向同一个对象的数量),当引用计数为0,自动释放对象。引用减少如你把指针指向另一个对象,或者销毁这个指针,引用减一,还有些地方说超出作用域引用减一,但本质上还是销毁。加一就是让一个指针值过去就行了。
#include "iostream"
#include "memory"
using namespace std;
class MyClass {
public:
void printMessage() {
std::cout << "Hello from MyClass!" << std::endl;
}
};
int main() {
shared_ptr<MyClass> ptr1 = make_shared<MyClass>();
shared_ptr<MyClass> ptr2 = ptr1;
ptr1->printMessage();
ptr2->printMessage();
cout << ptr1.use_count()<<endl;
system("pause");
return 0;
}
C++智能指针unique_ptr(QScopedPointer)
unique_ptr<类型> :唯一指针,只能用一个指针指向同一个对象,当销毁或转移,自动释放对象。
#include <iostream>
#include <memory>
class MyClass {
public:
void printMessage() {
std::cout << "Hello from MyClass!" << std::endl;
}
};
int main() {
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
ptr1->printMessage();
// 以下代码会报错,因为 unique_ptr 不支持共享所有权
// std::unique_ptr<MyClass> ptr2 = ptr1;
return 0;
}
C++智能指针weak_ptr(QWeakPointer)
weak_ptr<类型> :是一种弱引用的智能指针,它不会影响对象的生命周期,主要用于解决循环引用的问题或者在需要观察对象但不影响其所有权的情况下使用。
其实主要还是解决循环引用问题,因为当你用shared_ptr、unique_ptr构成循环是不会自动释放内存的,这就会内存泄漏,但weak_ptr本身不增加引用计数,所以超出作用域了就自动释放了。
class A;
class B {
public:
std::shared_ptr<A> aPtr;
};
class A {
public:
std::weak_ptr<B> bPtr;
};
void someFunction() {
std::shared_ptr<B> b = std::make_shared<B>();
std::shared_ptr<A> a = std::make_shared<A>();
b->aPtr = a;
a->bPtr = b;
}
还有一个c++98 auto_ptr 的废除指针,是个会转移所有权的指针,多线程中容易寄,所以c++11就废除了。
有啥讲的不对不好的欢迎大家指出。