Shared and Weak Pointers: Subtle Connections

Shared and Weak Pointers: Subtle Connections

Due to the reference counting mechanism, shared pointers are prone to forming reference circles which can lead to memory leaks. To address this problem, shared pointers have a counterpart - weak pointers.

Let's consider an implementation of the listener pattern. There is an ?????????????????????? class that produces events and a ???????????????? class that consumes those events. When an event is raised, the listener gets notified through the ????????????????::????????????() method and should pull updates from ?????????????????????? using the ??????????????????????::????????????????????() method.

The dependency between these two classes can be represented in the following diagram:

In this setup, the objects form a typical reference circle. If only shared pointers are used, the memory cannot be deallocated, even when there are no external references. To prevent this, ?????????????????????? holds a shared pointer to listeners, while ???????????????? holds only a weak pointer to ??????????????????????.

class EventSource {
public:
  std::vector<std::string> getUpdates() const;
private:
  std::vector<std::shared_ptr<Listener>> m_listeners;
};        
class Listener {
public:
  Listener(std::weak_ptr<EventSource> source);
  virtual void notify() = 0;
protected:
  std::weak_ptr<EventSource> getSource();
private:
  std::weak_ptr<EventSource> m_source;
};        

Creating a new copy of ??????::????????_?????? does not increase the reference count. When you need actual access to the object, a ??????::????????????_?????? should be obtained, as shown in a possible implementation of ????????????????::????????????():

void ConcreteListener::notify() {
  std::shared_ptr<EventSource> source = getSource().lock();
  if (!source) {
    return;
  }
  auto updates = source->getUpdates();
  // ...
}        

To obtain a shared pointer from a weak pointer, follow these steps:

  1. Call ??????::????????_??????::????????().
  2. Verify that the result is a valid ??????::????????????_?????? object.
  3. Use the pointer.

要查看或添加评论,请登录

Nikolai Kutiavin的更多文章

  • Golang generic implementation for Producer-Consumer

    Golang generic implementation for Producer-Consumer

    Producer-consumer design pattern is well-known in software development. In a few words, one object produces values, and…

    6 条评论
  • Factory Method in Python with blackjack and ?h?o?o?k?e?r?s? decorators.

    Factory Method in Python with blackjack and ?h?o?o?k?e?r?s? decorators.

    Design patterns help organize code in a better way, improving readability and maintainability. Many design patterns can…

    8 条评论
  • Non-blocking synchronization for std::vector

    Non-blocking synchronization for std::vector

    In my previous post, I described how to protect a std::vector using std::mutex. It was straightforward.

    13 条评论
  • Unit-test in C++: what should you know.

    Unit-test in C++: what should you know.

    Unit tests are important for a single reason - they prove that a single component works as expected in isolation. If a…

    9 条评论
  • C++ transactional memory

    C++ transactional memory

    Sometimes I feel like an archaeologist, and today I’ll share one of my findings: an old proposal for the C++ standard…

    24 条评论
  • Behavior vs Data concurrency protection

    Behavior vs Data concurrency protection

    Multithreading is one of the hottest topics in C++. However, the most crucial question isn't just about running code…

  • Why preprocessor directives are evil

    Why preprocessor directives are evil

    I'll start with a simple quiz: Do you think the code below is correct? Does it make more sense now? Preprocessor…

    42 条评论
  • Perl with classes

    Perl with classes

    Originally developed as a procedural language, Perl was later adapted to support modern Object-Oriented Programming…

    4 条评论
  • r-value reference: when and why?

    r-value reference: when and why?

    C++ has two commonly used types of references: l-value and r-value. An l-value reference points to an object with a…

    6 条评论
  • Network transport protocol: reliability and message-orientation out of the box

    Network transport protocol: reliability and message-orientation out of the box

    If I asked you to name a reliable network protocol for the transport layer, what would be the first one that comes to…

    4 条评论

社区洞察

其他会员也浏览了