c++ - 当函数按值传递参数时,复制构造函数如何工作?

标签 c++ function constructor copy this

我一直在研究链表,并有一个函数 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;
}

最佳答案

  1. 您刚刚像~LinkedList(); 一样声明了析构函数。理想情况下,您也应该定义它并且应该在其中编写一些 delete 代码以释放一些内存。或者将定义留空为 ~LinkedList() { }。这就是 (2) 产生崩溃的原因。

  2. 您应该有一个默认构造函数 或一些其他方法来初始化指针。如果在未初始化的情况下使用指针,则缺少此步骤会产生异常。

  3. 正如 WhozCraig 在评论中提到的,struct 定义应以 ; - 分号结尾。

  4. 您正在调用 InsertData(),您类中的函数读取为 DataInsert()。这是错字吗?

关于c++ - 当函数按值传递参数时,复制构造函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193726/

相关文章:

javascript - 为什么 JavaScript ES6 不支持多构造类?

c++ - 优化 WordWrap 算法

c++ - 为什么程序在不暂停的情况下关闭?(C++)

c++ - 确定跨域 Active Directory 组成员身份

c - 尝试使用嵌套表在 Lua 中调用函数

c - 指向函数错误的指针

c++ - 出于加密目的,对象销毁是否可靠?

r - 如何在 R 中编码基本对称多项式

javascript - 有人可以澄清原型(prototype)和构造函数这两个词的歧义吗?

c++ - 如何使用成员初始化列表来初始化数组?