我一直在研究链表,并有一个函数 CountListItems()
按值传递列表。将创建一个拷贝并调用复制构造函数。
复制构造函数在尝试复制时崩溃。我很困惑,this
在复制构造函数中指向什么?在这种情况下没有调用对象,对吗?
当我运行调试器时,this
具有与参数相同数量的节点,但它的所有值都未初始化。
任何尝试删除 this
的节点都会导致崩溃。复制构造函数底部的第 (1) 行是我当前的解决方案。即使程序运行,这是否会导致内存泄漏?
//main.cpp
int CountListItems(LinkedList data);
int main ()
{
LinkedList list;
int x = 1;
list.InsertData(x);
/* Pass LinkedList by value, so that the copy constructor is invoked. */
CountListItems(data);
return 0;
}
//LinkedList.h
class LinkedList
{
public:
struct Node
{
int data;
Node *prev;
Node *next;
}
/* Copy constructor */
LinkedList(LinkedList &original);
~LinkedList();
DataInsert(int data);
private:
/* Copy list node by node. */
void CopyList(LinkedList &original);
Node *first;
Node *curr;
Node *last;
};
//LinkedList.cpp
/* Copy Constructor */
LinkedList::LinkedList(LinkedList &original)
{
first = last = curr = 0; // (1) Attempt at a solution (Initialize "this")
/* this->~LinkedList(); */ // (2) Produces Crash
CopyList(original); // (3) Without (1) Produces Crash
return;
}
最佳答案
您刚刚像
~LinkedList();
一样声明了析构函数
。理想情况下,您也应该定义它并且应该在其中编写一些delete
代码以释放一些内存。或者将定义留空为~LinkedList() { }
。这就是 (2) 产生崩溃的原因。您应该有一个
默认构造函数
或一些其他方法来初始化指针。如果在未初始化的情况下使用指针,则缺少此步骤会产生异常。正如 WhozCraig 在评论中提到的,
struct
定义应以;
- 分号结尾。您正在调用
InsertData()
,您类中的函数读取为DataInsert()
。这是错字吗?
关于c++ - 当函数按值传递参数时,复制构造函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193726/