C++ Linked Lists   «Prev  Next»
Lesson 8A singly linked list
ObjectiveThe release() member function

C++ release() function

The C++ Standard Library itself does not define a generic `release()` member function. However, the `release()` member function is part of certain types within the Standard Library. Here are some notable examples:
  1. std::unique_ptr<T>::release()
    • The release() member function is available in std::unique_ptr, a smart pointer that manages the lifetime of a dynamically allocated object.
    • Purpose: Releases ownership of the managed object and returns a pointer to it, leaving the unique_ptr empty.
    • Example:
      #include <memory>
      #include <iostream>
      
      int main() {
          std::unique_ptr<int> ptr = std::make_unique<int>(42);
          int* rawPtr = ptr.release(); // Releases ownership
          std::cout << *rawPtr << std::endl; // Prints 42
          delete rawPtr; // Manually delete since ownership is released
          return 0;
      }
                      
  2. std::basic_streambuf<CharT, Traits>::release()
    • The release() member function exists in std::basic_streambuf, which is a component of the input/output stream library.
    • Purpose: Releases and returns a pointer to the internally managed buffer object.
    • Example: Usage is rare and primarily involves custom stream buffer implementations.

Notes:
  • Other libraries or frameworks may define their own release() functions, but these are not part of the standard library.
  • If you encounter a release() function in code, check its context to understand its behavior, as it could be part of user-defined types or third-party libraries.

Big C++

"release() member function" using the "singly linked list implementation" in C++17.

Here’s an implementation of the `release()` member function in the context of a singly linked list in C++17.
The `release()` function detaches the head node of the list and returns its pointer, leaving the rest of the list intact.
Implementation
#include 
#include 

// Node structure for the singly linked list
template 
struct Node {
    T data;
    std::unique_ptr next;

    Node(T value) : data(value), next(nullptr) {}
};

// Singly linked list implementation
template 
class SinglyLinkedList {
private:
    std::unique_ptr head;

public:
    SinglyLinkedList() : head(nullptr) {}

    // Function to add an element to the front of the list
    void push_front(T value) {
        auto newNode = std::make_unique(value);
        newNode->next = std::move(head);
        head = std::move(newNode);
    }

    // Function to release the head node
    Node<T>* release() {
        if (!head) {
            return nullptr; // If the list is empty, return nullptr
        }
        Node<T>* rawHead = head.release(); // Release ownership of the head node
        head = std::move(rawHead->next); // Update head to the next node
        return rawHead;
    }

    // Function to print the list
    void print() const {
        Node<T>* current = head.get();
        while (current) {
            std::cout << current->data << " -> ";
            current = current->next.get();
        }
        std::cout << "nullptr" << std::endl;
    }

    // Destructor to clean up the list
    ~SinglyLinkedList() {
        while (head) {
            head = std::move(head->next);
        }
    }
};

int main() {
    SinglyLinkedList list;

    // Add some elements to the list
    list.push_front(10);
    list.push_front(20);
    list.push_front(30);

    std::cout << "Original list: ";
    list.print();

    // Release the head node
    Node* releasedNode = list.release();
    if (releasedNode) {
        std::cout << "Released node: " << releasedNode->data << std::endl;
        delete releasedNode; // Manually delete the released node
    }

    std::cout << "List after release: ";
    list.print();

    return 0;
}

Explanation
  1. Node Structure:
    • Represents each node of the singly linked list, with a data value and a next pointer.
  2. push_front Method:
    • Adds a new element to the front of the list.
  3. release Method:
    • Detaches the head node by calling release() on the std::unique_ptr managing it.
    • Updates the head of the list to the next node.
    • Returns a raw pointer to the detached node.
  4. print Method:
    • Traverses and prints the list.
  5. main Function:
    • Demonstrates creating a list, adding elements, releasing the head node, and printing the list before and after the release.

Output
Original list: 30 -> 20 -> 10 -> nullptr
Released node: 30
List after release: 20 -> 10 -> nullptr

This implementation showcases how `std::unique_ptr` and its `release()` function can be applied to manage dynamic memory in a singly linked list.

Examine the release() member function of the singly linked list implementation.

The release function is used to return all list elements to free store. It marches down the list doing so.
//elements returned to free store
void slist::release()
{
   while (h != 0)
      del();
}

Each element of the list should be returned to free store in sequence. This is done for a single element by slist::del(), which manipulates the hidden pointer h. Since we are destroying the list, it is unnecessary to preserve the original value of pointer h. This function's chief use is as the body of the destructor slist::~slist(). We could not use a destructor written
slist::~slist()
{
   delete h;
}
because it deletes only the first element in the list.

SEMrush Software