I am trying to figure out how C++ resource management works, especially in relation to constructors/destructors. This is my test code;
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));
    } 
}
And here is the output;
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)
According to above output, constructor called for each object once, but destructors called four times.
I was expecting to see multiple temporary copies being constructed/destructed but why is number of constructors/destructos is not matching.
If, for example, I was opening files or db connections on constructors and closing them on destructors, would I get in trouble in above scenario?
 
    