我试图弄清楚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)
根据上面的输出,构造函数调用每个对象一次,而析构函数调用四次。
我希望看到多个临时副本被构造/析构,但为什么构造函数/析构函数的数量不匹配。
例如,如果我在构造函数上打开文件或数据库连接,而在析构函数上关闭它们,那么在上面的场景中我会遇到麻烦吗?
1条答案
按热度按时间8dtrkrch1#
将这个复制构造函数添加到
myObj
函数中,以查看额外的myObj
对象是如何被构造的,一旦你有了这个,你就会看到构造函数调用的数量与析构函数调用的数量相匹配。