Ваш AClass
член double* data;
будет скопирован сюда:
AClass y = *x;
Поскольку вы не предоставили конструкторы / операторы копирования / перемещения, необработанный указатель будетв этих ситуациях копируется как есть , а delete[] data
будет выполняться как x
, так и y
в деструкторе.
Обязательное чтение при работе с необработанными указателями: https://en.cppreference.com/w/cpp/language/rule_of_three
И эти:
Что такое правило трех?
Правило трех становится правилом пяти с C ++ 11?
Вот пример реализации функций-членов, упомянутых в приведенных выше статьях. Это немного - и подвержено ошибкам, поэтому почти всегда лучше использовать стандартный контейнер.
#include <algorithm>
#include <iostream>
#include <utility>
class AClass {
public:
AClass(size_t len, double val);
// rule of five:
AClass(const AClass& rhs); // copy constructor
AClass(AClass&& rhs); // move constructor
AClass& operator=(const AClass& rhs); // copy assignment
AClass& operator=(AClass&& rhs); // move assignment
~AClass();
private:
size_t length; // use an unsigned type since you only accept unsigned values
double* data;
};
// destructor
AClass::~AClass() {
delete[] data;
}
AClass::AClass(size_t len, double val) :
length(len),
data(new double[length])
{
std::fill_n(data, length, val);
}
// copy constructor
AClass::AClass(const AClass& rhs) :
length(rhs.length),
data(new double[length])
{
std::copy_n(rhs.data, length, data);
}
// move constructor
AClass::AClass(AClass&& rhs) :
length(std::exchange(rhs.length, 0)),
data(std::exchange(rhs.data, nullptr))
{}
// copy assignment
AClass& AClass::operator=(const AClass& rhs) {
double* tmpdata = new double[rhs.length];
delete[] data;
length = rhs.length;
data = tmpdata;
std::copy_n(rhs.data, length, data);
return *this;
}
// move assignment
AClass& AClass::operator=(AClass&& rhs) {
// leave the destruction up to the moved-from object
std::swap(length, rhs.length);
std::swap(data, rhs.data);
return *this;
}
int main() {
AClass* x = new AClass(10, -1.0);
AClass y = *x;
delete x;
}