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;
}
我有一个带有基本操作(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;
}