所以我在这里的不同主题中看到过这种问题,但找不到这种情况所需的答案......
就像我在标题中提到的那样,我的代码在Visual Studio 2013上工作正常,没有内存泄漏或任何类似的东西,但是当通过Ubuntu的平台运行时,它运行到调用复制构造函数的点,然后在将第二个节点设置为new,我已经尝试将该构造函数标题中'const'的位置切换为函数之后或类型名称之后,它根本不起作用然后,我尝试更改顺序函数,只是没有做任何事情,我尝试以不同的方式调用复制构造函数,也只是给出了相同的结果,我也尝试向我的实践老师展示这个,你可以猜到它的结果虽然我是还在这里写这个帖子:P
我错过了什么?
下面的代码表示循环链接列表,每个节点中有2种数据类型: .HPP
#include <iostream>
#include <string>
using namespace std;
class MyLinkedList{
private:
class Node{
public:
Node* next;
Node* prev;
string key;
double data;
Node(const string key, const double data)
{
this->next = this->prev = NULL;
this->key = key;
this->data = data;
}
Node(const Node* node)
{
this->next = this->prev = NULL;
this->key = node->key;
this->data = node->data;
}
};//END OF NODE
Node* head;
Node* tail;
public:
MyLinkedList();
void add(const string& key, const double& data);
MyLinkedList(const MyLinkedList& MLL);
~MyLinkedList();
bool empty();
void printList();
MyLinkedList& operator=(const MyLinkedList&);
int remove(const string&);
bool isInList(const string, double&);
double sumList();
};
.cpp(部分):
#include "MyLinkedList.hpp"
MyLinkedList::MyLinkedList(){
head = tail = NULL;
}
void MyLinkedList::add(const string& key, const double& data){
if (empty()){
head = new Node(key, data);
tail = head->next = head->prev = head;
tail->next = tail->prev = head;
return;
}
tail->next = new Node(key, data);//**(Segmentation fault HERE)**
tail->next->prev = tail;
tail = tail->next;
tail->next = head;
head->prev = tail;
}
MyLinkedList::MyLinkedList(const MyLinkedList& MLL){
if (MLL.head == NULL){
head = tail = NULL;
return;
}
Node* N1 = MLL.head;
do{
add(N1->key, N1->data);//<--falls on the second time
N1 = N1->next;
} while (N1 != MLL.head);
}
bool MyLinkedList::empty(){
return head==NULL;
}
int main(){
MyLinkedList A;
A.add("key1", 1);
A.printList();
A.add("key4", 2);
A.add("key3", 3);
A.add("key4", 4);
A.printList();
cout << "sum: " << A.sumList() << endl;
MyLinkedList A2(A);// <--Segmentation fault within.
A2.printList();
}
答案 0 :(得分:4)
您不像在默认构造函数中那样初始化复制构造函数中的指针,因此当您调用add
时它们会悬空。做
MyLinkedList::MyLinkedList(const MyLinkedList& MLL) {
head = tail = NULL;
// Rest as before
几个附注:由于你使用的是MSVC 2013,它有(有限的)C ++ 11支持,你也可以写
// nullptr is the typesafe C++11 way to write NULL
Node* head = nullptr;
Node* tail = nullptr;
在课堂上再也不用担心了。另一种风格是,在ctor init列表中初始化数据成员而不是像构造函数体内那样可以说是更好的样式:
MyLinkedList::MyLinkedList(const MyLinkedList& MLL)
: head(nullptr),
tail(nullptr) {
...
因为这也适用于非默认构造的成员,例如引用。