C++ - 链表 - 复制构造函数
C++ - linked list - copy constructor
我正在尝试实现复制构造函数,但我遇到了奇怪的问题。 你能指出我做错了什么吗?
我得到:双重释放或损坏(输出(:0x08936a48
输出错误:
Constructor called...
MyList:
10 --> 20 --> 30 --> 40 -->
MyList2:
10 --> 20 --> 30 --> 40 -->
Destructor called...
法典:
#include <iostream>
template <typename T>
class SingleLinkedList{
protected:
struct Node{
T data;
Node * next;
Node() : next(nullptr) {}
Node(const T num) : data(num), next(nullptr) {}
};
private:
Node * head;
Node * tail;
public:
SingleLinkedList(); // constructor
~SingleLinkedList(); // destructor
SingleLinkedList(const SingleLinkedList &object); // copy constructor
SingleLinkedList& operator=(const SingleLinkedList &object); // copy assignment
void insert(T const& value);
void displayList(std::ostream& stream = std::cout) const;
template <typename T>
SingleLinkedList<T>::SingleLinkedList() : head(nullptr), tail(nullptr){
std::cout << "Constructor called..." << std::endl;
}
template <typename T>
SingleLinkedList<T>::~SingleLinkedList(){
std::cout << "Destructor called..." << std::endl;
int index = 1;
Node * temp = nullptr;
while(head!=nullptr){
temp = head;
head = head->next;
delete temp;
//std::cout << "Node number: " << index << " destroyed" << std::endl;
index++;
}
}
template <typename T>
SingleLinkedList<T>::SingleLinkedList(const SingleLinkedList<T> &oldList){
SingleLinkedList<T> * newList = new SingleLinkedList<T>();
// is it necessary? my constructor by default initializes head and tail with nulls
head = nullptr;
tail = nullptr;
Node * temp = nullptr;
temp = oldList.head;
while(temp!=nullptr){
newList->insert(temp->data);
temp = temp->next;
}
}
template <typename T>
void SingleLinkedList<T>::insert(T const& value){
Node * temp = new Node(value);
//temp->data = value;
//temp->next = nullptr;
if(head==nullptr){
head = temp;
tail = temp;
}
else{
tail->next = temp;
tail = temp;
}
}
template <typename T>
void SingleLinkedList<T>::displayList(std::ostream& stream) const{
Node * temp = nullptr;
temp = head;
while(temp!=nullptr){
stream << temp->data << " --> ";
temp = temp->next;
}
stream << std::endl;
}
int main(){
SingleLinkedList<int> * myList = new SingleLinkedList<int>();
SingleLinkedList<int> * myList2 = myList;
myList->insert(10);
myList->insert(20);
myList->insert(30);
myList2->insert(40);
std::cout << "MyList:" << std::endl;
myList->displayList();
std::cout << "MyList2:" << std::endl;
myList2->displayList();
delete myList;
delete myList2;
return 0;
}
我的"算法": 1. 创建新列表。 2.对于旧列表的每个节点,获取数据并将其插入新列表。
我不明白如何使用两个不同的列表来释放内存的同一部分。 我是学生,不是专业人士。我请求您的理解。
你的复制 ctor 真的很奇怪。您不是将元素添加到正在构造的列表中,而是创建一个新列表(为什么?(,然后向其添加元素。之后,您只需退出功能即可。创建的新列表保留在堆上无法访问,即泄漏,并且构建的列表保持为空。
你能简单地insert
复制列表的元素,不是在某些newList
,而是在这个?
双重删除的发生还有另一个原因:在main
中,您声明了两个指针,myList
和myList2
,它们都指向内存中的同一列表,然后尝试删除它们。您可以通过正确构造myList2
来快速修复它:
SingleLinkedList<int> * myList2{new SingleLinkedList<int>(*myList)};
但我建议你完全摆脱main
中的指针:
SingleLinkedList<int> myList;
SingleLinkedList<int> myList2(myList);
(之后不要忘记将所有->
更改为下面的.
。
这毕竟不是Java,不是每一辈子都从new
开始。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类