柚子快報激活碼778899分享:開發(fā)語言 QT智能指針詳解
柚子快報激活碼778899分享:開發(fā)語言 QT智能指針詳解
目錄
QScopedPointerQSharedPointerQWeakPointer
QScopedPointer
QScopedPointer 是 Qt 框架中提供的一個智能指針類,其核心目的是為了管理動態(tài)分配的對象的生命周期。它保證在 QScopedPointer 所在的作用域結(jié)束時自動刪除其管理的對象,從而幫助防止內(nèi)存泄漏。它類似于 C++11 的 std::unique_ptr,但不支持 C++11 的移動語義
1.特點:
自動資源管理:QScopedPointer 自動釋放它所持有的對象,確保資源得到合理的管理。所有權(quán):QScopedPointer 對象擁有嚴(yán)格的所有權(quán)管理,即它不允許復(fù)制或賦值,確保一個對象只有一個擁有者。作用域限定:QScopedPointer 確保只在定義它的局部作用域內(nèi)有效,出了作用域就會自動釋放所管理的資源。
2.常用方法:
reset():刪除當(dāng)前對象,接受一個新的對象指針以管理。如果不傳遞參數(shù),則簡單地刪除當(dāng)前對象并將指針置為 nullptrdata():返回一個指向所管理對象的裸指針,不改變所有權(quán)take():釋放對對象的所有權(quán)并返回對象的裸指針,QScopedPointer 隨后不再管理任何對象isNull():檢查 QScopedPointer 是否為空(即是否指向 nullptr)操作符重載:允許使用->訪問所持有的對象,就像普通指針一樣
使用示例
class MyClass {
public:
void display() { qDebug() << "Displaying MyClass"; }
};
void scopedPointerExample() {
QScopedPointer
ptr->display(); // 訪問通過 operator->()
ptr.reset(new MyClass()); // 重置指針,自動刪除舊對象
if (!ptr.isNull()) {
ptr->display();
}
MyClass* raw = ptr.take(); // 取出裸指針,ptr 現(xiàn)在為空
if (ptr.isNull()) {
qDebug() << "Pointer is now null.";
}
delete raw; // 手動刪除對象
}
QSharedPointer
QSharedPointer 是 Qt 庫中提供的一個引用計數(shù)型智能指針。它用于管理動態(tài)分配的對象的生命周期,通過跟蹤指向同一個對象的所有 QSharedPointer 實例的數(shù)量來實現(xiàn)。當(dāng)最后一個這樣的智能指針被銷毀或重置時,所管理的對象也會被自動刪除
1.特點
引用計數(shù):內(nèi)部通過引用計數(shù)來確保只有最后一個指針被銷毀時,對象才會被刪除線程安全:QSharedPointer 的引用計數(shù)機(jī)制是線程安全的,適用于多線程環(huán)境自動資源管理:自動管理所指向的對象,防止內(nèi)存泄漏復(fù)制和賦值:允許復(fù)制和賦值操作,復(fù)制時引用計數(shù)會增加,賦值時先減少原有對象的引用計數(shù),可能導(dǎo)致原有對象的刪除
這里特別說明一下線程安全這個問題,在官方文檔中翻了一下大概意思是這樣的: QSharedPointer 的線程安全性體現(xiàn)在其引用計數(shù)的增加和減少操作上。在多線程環(huán)境中,如果多個線程同時對同一個 QSharedPointer 對象執(zhí)行引用計數(shù)的增加和減少操作,Qt 會確保這些操作的原子性,避免了競態(tài)條件和數(shù)據(jù)競爭。官方文檔地址
2.常用方法
reset():重置智能指針,可以指定新的對象或者重置為 nullptrdata():返回管理的對象的裸指針,但不改變所有權(quán)isNull():檢查智能指針是否為空clear():等同于 reset(),將內(nèi)部指針置為 nullptr操作符重載:允許使用->訪問所持有的對象,就像普通指針一樣toStrongRef(): 返回一個新的 QSharedPointertoWeakRef() :返回一個 QWeakPointer,后者可以用來避免循環(huán)引用問題。
使用示例:
class MyClass {
public:
MyClass() { qDebug() << "MyClass created"; }
~MyClass() { qDebug() << "MyClass destroyed"; }
void display() const { qDebug() << "Displaying MyClass"; }
};
void sharedPointerExample() {
QSharedPointer
{
QSharedPointer
ptr2->display(); // 通過 ptr2 訪問對象
} // ptr2 出作用域,引用計數(shù)減少
ptr1->display(); // 對象仍然存在,可以通過 ptr1 訪問
} // ptr1 出作用域,引用計數(shù)為 0,對象被銷毀
QWeakPointer
QWeakPointer 是 Qt 庫中的一種智能指針,用于在不增加對象引用計數(shù)的情況下,持有對由 QSharedPointer 管理的對象的非擁有(弱)引用。它可以防止循環(huán)引用問題,并且當(dāng)原始 QSharedPointer 不再存在時,QWeakPointer 不會保持對象存活,而是變得無效
1.使用場景:
防止循環(huán)引用:當(dāng)使用 QSharedPointer 并且對象之間相互引用,可以用QWeakPointer 打破循環(huán)引用,防止內(nèi)存泄漏 -暫時引用:當(dāng)你需要引用一個對象,但不需要該對象因此而保持活躍時,使用 QWeakPointer
使用示例
class MyClass {
public:
MyClass() { qDebug() << "MyClass created"; }
~MyClass() { qDebug() << "MyClass destroyed"; }
};
void testWeakPointer() {
QWeakPointer
{
QSharedPointer
weak = strong;
if (weak.toStrongRef()) {
qDebug() << "Object is still alive";
}
}
if (!weak.toStrongRef()) {
qDebug() << "Object has been destroyed";
}
}
柚子快報激活碼778899分享:開發(fā)語言 QT智能指針詳解
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。