วิธีการที่คุณอธิบายไม่เพียง แต่เข้ากันได้กับ C ++ เท่านั้น แต่ยังเข้ากันได้กับ  (ส่วนใหญ่) ภาษาเซต C การเรียนรู้ที่จะพัฒนา C-style linked-list เป็นวิธีที่ดีในการแนะนำตัวเองเกี่ยวกับเทคนิคการเขียนโปรแกรมระดับต่ำ (เช่นการจัดการหน่วยความจำด้วยตนเอง) แต่โดยทั่วไปแล้วไม่ใช่แนวทางปฏิบัติที่ดีที่สุดสำหรับการพัฒนา C ++ สมัยใหม่
ด้านล่างนี้ฉันได้ใช้สี่รูปแบบในการจัดการรายการใน C ++
raw_pointer_demoใช้แนวทางเดียวกับของคุณ - การจัดการหน่วยความจำด้วยตนเองจำเป็นต้องใช้ตัวชี้ดิบ การใช้ C ++ ที่นี่มีไว้สำหรับ syntactic-sugarเท่านั้นและแนวทางที่ใช้นั้นเข้ากันได้กับภาษา C 
- ใน 
shared_pointer_demoการจัดการรายการยังดำเนินการด้วยตนเอง แต่การจัดการหน่วยความจำเป็นไปโดยอัตโนมัติ (ไม่ใช้ตัวชี้ดิบ) สิ่งนี้คล้ายกับสิ่งที่คุณเคยสัมผัสกับ Java 
std_list_demo ใช้ไลบรารีมาตรฐาน listคอนเทนเนอร์สิ่งนี้แสดงให้เห็นว่าสิ่งต่างๆจะง่ายขึ้นเพียงใดหากคุณพึ่งพาไลบรารีที่มีอยู่แทนที่จะใช้ไลบรารีของคุณเอง 
std_vector_demoใช้vectorคอนเทนเนอร์ไลบรารีมาตรฐาน สิ่งนี้จะจัดการที่เก็บรายการในการจัดสรรหน่วยความจำที่ต่อเนื่องกัน กล่าวอีกนัยหนึ่งก็คือไม่มีตัวชี้สำหรับแต่ละองค์ประกอบ ในบางกรณีที่ค่อนข้างรุนแรงสิ่งนี้อาจไม่มีประสิทธิภาพอย่างมีนัยสำคัญ สำหรับกรณีทั่วไป แต่นี้เป็นคำแนะนำวิธีปฏิบัติที่ดีที่สุดสำหรับการจัดการรายชื่อใน C 
หมายเหตุ: จากทั้งหมดนี้มีเพียงรายการที่raw_pointer_demoต้องการเท่านั้นที่จะทำลายรายการอย่างชัดเจนเพื่อหลีกเลี่ยงหน่วยความจำ "รั่ว" อีกสามวิธีจะทำลายรายการและเนื้อหาโดยอัตโนมัติเมื่อคอนเทนเนอร์อยู่นอกขอบเขต (ในตอนท้ายของฟังก์ชัน) ประเด็นคือ: C ++ สามารถเป็น "Java-like" ได้มากในเรื่องนี้ - แต่ถ้าคุณเลือกที่จะพัฒนาโปรแกรมของคุณโดยใช้เครื่องมือระดับสูงตามที่คุณต้องการ
/*BINFMTCXX: -Wall -Werror -std=c++11
*/
#include <iostream>
#include <algorithm>
#include <string>
#include <list>
#include <vector>
#include <memory>
using std::cerr;
/** Brief   Create a list, show it, then destroy it */
void raw_pointer_demo()
{
    cerr << "\n" << "raw_pointer_demo()..." << "\n";
    struct Node
    {
        Node(int data, Node *next) : data(data), next(next) {}
        int data;
        Node *next;
    };
    Node * items = 0;
    items = new Node(1,items);
    items = new Node(7,items);
    items = new Node(3,items);
    items = new Node(9,items);
    for (Node *i = items; i != 0; i = i->next)
        cerr << (i==items?"":", ") << i->data;
    cerr << "\n";
    // Erase the entire list
    while (items) {
        Node *temp = items;
        items = items->next;
        delete temp;
    }
}
raw_pointer_demo()...
9, 3, 7, 1
/** Brief   Create a list, show it, then destroy it */
void shared_pointer_demo()
{
    cerr << "\n" << "shared_pointer_demo()..." << "\n";
    struct Node; // Forward declaration of 'Node' required for typedef
    typedef std::shared_ptr<Node> Node_reference;
    struct Node
    {
        Node(int data, std::shared_ptr<Node> next ) : data(data), next(next) {}
        int data;
        Node_reference next;
    };
    Node_reference items = 0;
    items.reset( new Node(1,items) );
    items.reset( new Node(7,items) );
    items.reset( new Node(3,items) );
    items.reset( new Node(9,items) );
    for (Node_reference i = items; i != 0; i = i->next)
        cerr << (i==items?"":", ") << i->data;
    cerr<<"\n";
    // Erase the entire list
    while (items)
        items = items->next;
}
shared_pointer_demo()...
9, 3, 7, 1
/** Brief   Show the contents of a standard container */
template< typename C >
void show(std::string const & msg, C const & container)
{
    cerr << msg;
    bool first = true;
    for ( int i : container )
        cerr << (first?" ":", ") << i, first = false;
    cerr<<"\n";
}
/** Brief  Create a list, manipulate it, then destroy it */
void std_list_demo()
{
    cerr << "\n" << "std_list_demo()..." << "\n";
    // Initial list of integers
    std::list<int> items = { 9, 3, 7, 1 };
    show( "A: ", items );
    // Insert '8' before '3'
    items.insert(std::find( items.begin(), items.end(), 3), 8);
    show("B: ", items);
    // Sort the list
    items.sort();
    show( "C: ", items);
    // Erase '7'
    items.erase(std::find(items.begin(), items.end(), 7));
    show("D: ", items);
    // Erase the entire list
    items.clear();
    show("E: ", items);
}
std_list_demo()...
A:  9, 3, 7, 1
B:  9, 8, 3, 7, 1
C:  1, 3, 7, 8, 9
D:  1, 3, 8, 9
E:
/** brief  Create a list, manipulate it, then destroy it */
void std_vector_demo()
{
    cerr << "\n" << "std_vector_demo()..." << "\n";
    // Initial list of integers
    std::vector<int> items = { 9, 3, 7, 1 };
    show( "A: ", items );
    // Insert '8' before '3'
    items.insert(std::find(items.begin(), items.end(), 3), 8);
    show( "B: ", items );
    // Sort the list
    sort(items.begin(), items.end());
    show("C: ", items);
    // Erase '7'
    items.erase( std::find( items.begin(), items.end(), 7 ) );
    show("D: ", items);
    // Erase the entire list
    items.clear();
    show("E: ", items);
}
std_vector_demo()...
A:  9, 3, 7, 1
B:  9, 8, 3, 7, 1
C:  1, 3, 7, 8, 9
D:  1, 3, 8, 9
E:
int main()
{
    raw_pointer_demo();
    shared_pointer_demo();
    std_list_demo();
    std_vector_demo();
}