C++ 使用复制构造函数理解指针

C++ understanding pointer with copy constructor

我有一个带有基本操作(add/delete 等)的简单 LinkedList class 和一个复制构造函数:

LinkedList::LinkedList(const LinkedList& other) {
    data_ = other.data_;
    if (other.next_ == nullptr) next_ = nullptr;
    else next_ = new LinkedList(*other.next_);
}

我认为以下行为是预期的,但我不确定为什么...

int main() {
    LinkedList list1;
    list1.insert(1);
    list1.insert(2);

    // prints 1->2
    list1.print();

    // Copy constructor called
    LinkedList list2(list1);

    list1.insert(3);
    // prints 1->2->3
    list1.print();

    // prints 1->2
    list2.print();

    // Memory addresses are different
    cout << &list1 << " " << &list2 << endl;

    delete &list1;
    
    // Nothing printed
    list2.print();

}

删除list1时是否也删除对list2的引用?

list1 是在自动存储(“堆栈”)中创建的,因此您不能在其地址上调用 delete。这样做会导致未定义的行为,这意味着任何事情都可能发生,包括 list2 的损坏或程序的彻底崩溃。

要测试您的复制构造函数是否正常工作,您可以使用 new 在动态存储(“堆”)中创建两个列表,它必须与匹配的 delete 配对:

int main() {
    LinkedList *list1 = new LinkedList();
    list1->insert(1);
    list1->insert(2);

    // prints 1->2
    list1->print();

    // Copy constructor called
    LinkedList *list2 = new LinkedList(*list1);

    list1->insert(3);
    // prints 1->2->3
    list1->print();

    // prints 1->2
    list2->print();

    // Memory addresses are different
    cout << list1 << " " << list2 << endl;

    delete list1;
    
    // Still prints 1->2
    list2->print();

    delete list2;
}