Этот код: nd1 = Node(3);
не соответствует вашим ожиданиям.
Он не заменяет nd1
на Node(3)
и убивает старого nd1
.
Он создает новый временный экземпляр узла Node(3)
и копирует значение каждого члена в nd1
. Таким образом, и временный, и nd1
содержат указатель, указывающий на один и тот же адрес. В этот момент вы вытекли из памяти nd1
, выделенной в начале программы, поскольку на нее не ссылается ни один указатель, но вы не удалили ее.
Когда временный элемент умирает, nd1
указывает на мертвый Память. Когда nd1
запускает свой деструктор на втором }
, он снова удаляет тот же указатель, следовательно, ваша ошибка.
Чтобы исправить это, вам нужно будет реализовать то, что называется правилом пяти или правило нуля.
Самым простым является правило нуля. Просто используйте unique_ptr
и уничтожение произойдет, как и ожидалось:
struct Node
{
Node(uint16_t n) : p(std::make_unique<uint16_t[]>(n)) {
cout<<"Constructed with size= "<<n<<", memory addr: "<<(p)<<endl;
for(uint16_t i=0; i<n; i++) p[i] = n;
}
std::unique_ptr<uint16_t[]> p;
};
int main()
{
{
Node nd1(7);
{
nd1 = Node(3); // assignement destroys the old buffer
cout << "1st place holder" << endl;
}
cout << "2nd place holder" << endl;
}
return 0;
}