Проблема в этих двух строках:
Buffer newBuffer(size);
...
this->doubles = newBuffer.doubles;
Первая строка создает новый объект Buffer
. Во второй строке this->double
указывает на ту же память, на которую указывает newBuffer.doubles
. Таким образом, у вас есть два отдельных указателя оба указателя на одну и ту же память .
Теперь, когда это сделано, объект newBuffer
выходит из области видимости и разрушается. И деструктор освободит память, на которую указывают this->doubles
и newBuffer.doubles
. Эта память больше не доступна для вашего приложения, ее использование каким-либо образом приводит к неопределенному поведению . Это включает в себя как печать , так и , более конкретно, удаление памяти за секунду времени в деструкторе.
Самый простой способ решить вашу проблему - это понять, что вам не нужен временный newBuffer
объект, вы можете просто инициализировать this->doubles[i]
прямо в цикле:
for (int i=0; i<size; ++i) this->doubles [i] = d;
Что касается того, почему иногда кажется, что это работает, то это потому, что одно из возможных поведений UB ( Undefined Behavior ), по-видимому, работает нормально. В других случаях это может привести к сбою или другому странному поведению в, казалось бы, не связанных частях вашей программы.