c++ 调用的析构函数没有匹配的构造函数

h7wcgrx3  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(252)

我试图弄清楚C++资源管理是如何工作的,特别是与构造函数/析构函数有关的。
ylist.h

#pragma once
template <class T>
struct ListNode
{
    T elem;
    struct ListNode* next;
    ListNode(T elem):elem(elem),next(nullptr) {}
};

template <class T>
class List
{
    ListNode<T> *head;

public:
    List() : head(nullptr)
    {

    }
    ~List()
    {
        ListNode<T>* cursor = head;
        while (cursor != nullptr)
        {
            ListNode<T>* next = cursor->next;
            delete cursor;
            cursor = next;
        }
    }
    void append(T item)
    {
        ListNode<T>* n = new ListNode<T>(item);
        if (head == nullptr)
        {
            head = n;
        }
        else
        {
            ListNode<T>* cursor = head;
            while (cursor->next != nullptr)
                cursor = cursor->next;
            cursor->next = n;
        }
    }
};

main.cpp

#include <iostream>
#include "ylist.h"

using namespace std;

class myObj
{
    int val;
public:
    myObj(int val):val(val)
    {
        cout << "myObj@" << this << "(" << val << ")" << endl;
    }

    ~myObj()
    {
        cout << "~myObj@" << this << "(" << val << ")" << endl;
    }

};

int main()
{
    List<myObj> myList;

    for (int i = 0; i < 3; i++)
    {
        myList.append(myObj(i));
    } 
}

这是输出结果

myObj@00000039614FFAC0(0)
~myObj@00000039614FFAD0(0)
~myObj@00000039614FFAC8(0)
~myObj@00000039614FFAC0(0)
myObj@00000039614FFAC0(1)
~myObj@00000039614FFAD0(1)
~myObj@00000039614FFAC8(1)
~myObj@00000039614FFAC0(1)
myObj@00000039614FFAC0(2)
~myObj@00000039614FFAD0(2)
~myObj@00000039614FFAC8(2)
~myObj@00000039614FFAC0(2)
~myObj@0000019878DF6100(0)
~myObj@0000019878DF5F20(1)
~myObj@0000019878DF6200(2)

根据上面的输出,构造函数调用每个对象一次,而析构函数调用四次。
我希望看到多个临时副本被构造/析构,但为什么构造函数/析构函数的数量不匹配。
例如,如果我在构造函数上打开文件或数据库连接,而在析构函数上关闭它们,那么在上面的场景中我会遇到麻烦吗?

8dtrkrch

8dtrkrch1#

将这个复制构造函数添加到myObj函数中,以查看额外的myObj对象是如何被构造的,一旦你有了这个,你就会看到构造函数调用的数量与析构函数调用的数量相匹配。

myObj(const myObj & rhs):val(rhs.val)
{
    cout << "COPY CTOR myObj@" << this << "(" << val << ")" << endl;
}

相关问题