Heim > Backend-Entwicklung > C++ > Hauptteil

C++ Smart Pointer: Erweiterte Verwendung und Überlegungen

王林
Freigeben: 2024-05-09 17:06:05
Original
377 Leute haben es durchsucht

C++ 智能指针:高级用法和注意事项

C++ Smart Pointer: Erweiterte Verwendung und Vorsichtsmaßnahmen

Erweiterte Verwendung:

1. Benutzerdefinierte Smart Pointer:
Sie können Ihren eigenen Smart Pointer erstellen, geerbt von std::unique_ptr oder <code>std::shared_ptr, um das Verhalten an bestimmte Anforderungen anzupassen. std::unique_ptrstd::shared_ptr,为特定需求定制行为。

class CustomPtr : public std::unique_ptr<int> {
public:
    CustomPtr(int* ptr) : std::unique_ptr<int>(ptr) {}
    ~CustomPtr() { std::cout << "CustomPtr destroyed" << std::endl; }
};
Nach dem Login kopieren

2. 转换智能指针:
可以使用 std::make_uniquestd::make_shared 函数轻松地在不同类型的智能指针之间转换。

std::unique_ptr<int> up = std::make_unique<int>(42);
std::shared_ptr<int> sp = std::make_shared<int>(*up);
Nach dem Login kopieren

3. 循环引用:
当两个智能指针相互引用时,可能会创建循环引用。可以修改其中一个智能指针的类型来打破循环。

struct Node {
    std::unique_ptr<Node> next;
    std::shared_ptr<Node> prev;
};
Nach dem Login kopieren

注意事项:

1. 内存泄漏:
忘记使用智能指针包裹资源会导致内存泄漏。确保始终使用智能指针管理动态分配的内存。

2. 悬垂指针:
智能指针可能指向已删除的对象,从而导致悬垂指针。避免在使用智能指针之前检查它们的有效性。

3. 自循环:
智能指针可以指向自己,导致自循环。避免在智能指针的构造函数中分配同一对象。

4. 性能开销:
智能指针比原始指针具有性能开销。在需要时使用它们,例如在复杂的数据结构中或跨多线程访问资源时。

实战案例:

考虑下面示例,展示了共享指针如何防止悬垂指针:

class Widget {
public:
    std::shared_ptr<Widget> createChild() {
        return std::make_shared<Widget>();
    }
};

int main() {
    std::shared_ptr<Widget> parent = std::make_shared<Widget>();
    std::shared_ptr<Widget> child = parent->createChild();
    
    // ... 代码块 1,父对象 parent 被删除 ...
    
    // 代码块 2,child 仍然有效
    child->doSomething();
    
    return 0;
}
Nach dem Login kopieren

在这个示例中,即使父对象 parent 被删除,代码块 2 中的 child 仍然有效,因为 std::shared_ptrrrreee

🎜2. Intelligente Zeiger konvertieren: 🎜🎜Mit den Funktionen std::make_unique und std::make_shared können Sie problemlos zwischen verschiedenen Arten von intelligenten Zeigern konvertieren. 🎜rrreee🎜🎜3. Zirkelverweis: 🎜🎜Wenn zwei intelligente Zeiger aufeinander verweisen, kann ein Zirkelverweis erstellt werden. Sie können den Typ eines der intelligenten Zeiger ändern, um den Kreislauf zu durchbrechen. 🎜rrreee🎜🎜Hinweise: 🎜🎜🎜🎜1. Speicherlecks: 🎜🎜Das Vergessen, Ressourcen mit intelligenten Zeigern zu verpacken, kann zu Speicherlecks führen. Stellen Sie sicher, dass Sie immer intelligente Zeiger verwenden, um dynamisch zugewiesenen Speicher zu verwalten. 🎜🎜🎜2. Hängende Zeiger: 🎜🎜Intelligente Zeiger zeigen möglicherweise auf gelöschte Objekte, was zu baumelnden Zeigern führt. Vermeiden Sie es, die Gültigkeit intelligenter Zeiger zu überprüfen, bevor Sie sie verwenden. 🎜🎜🎜3. Selbstschleifen: 🎜🎜Intelligente Zeiger können auf sich selbst zeigen und so Selbstschleifen verursachen. Vermeiden Sie die Zuweisung desselben Objekts im Konstruktor eines Smart Pointers. 🎜🎜🎜4. Leistungsaufwand: 🎜🎜Intelligente Zeiger haben einen Leistungsaufwand als rohe Zeiger. Verwenden Sie sie bei Bedarf, beispielsweise in komplexen Datenstrukturen oder beim Zugriff auf Ressourcen über mehrere Threads hinweg. 🎜🎜🎜Tatsächliches Beispiel: 🎜🎜🎜Betrachten Sie das folgende Beispiel, das zeigt, wie gemeinsam genutzte Zeiger baumelnde Zeiger verhindern: 🎜rrreee🎜In diesem Beispiel gilt, obwohl das übergeordnete Objekt parent gelöscht wird, das child ist weiterhin gültig, da std::shared_ptr den gemeinsamen Besitz des Objekts beibehält. 🎜

Das obige ist der detaillierte Inhalt vonC++ Smart Pointer: Erweiterte Verwendung und Überlegungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage