C++: wntdll.pdb 未正确加载 class 使用运算符破坏
C++: wntdll.pdb not loaded correctly on class destruction with operator
注意:我使用的是 visual studio 社区 2019 C++14 编译器。
似乎以下程序正在尝试删除一个空位置。我在调用 + 运算符后尝试删除自定义向量 class...
这是代码:
class Vector
{
public:
Vector(const double* t, int dim) : m_dim(dim)
{
m_t = new double[dim];
for (int i = 0; i < dim; i++) {
m_t[i] = t[i];
}
}
~Vector() {
delete[] m_t;
}
Vector operator+(const Vector& v) {
Vector tmp{ v };
for (int i = 0; i < v.m_dim; i++) {
tmp.m_t[i] = tmp.m_t[i] + m_t[i];
}
return tmp;
}
private:
double* m_t;
int m_dim = 0;
};
int main() {
double t[] = { 1,2,3 };
Vector a{ t, 3 };
Vector b{ t, 3 };
Vector c{ t, 3 };
a = b + c;
// a answer is wrong,
// destructor, wntdll.pdb not loaded correctly
}
我认为该错误与 + 运算符在返回值之前删除“tmp”对象有关。我只是不知道如何解决它。我尝试用指针和“新”运算符替换它,但没有用。
感谢@AlZ23z 和@Ted Lyngmo 的回答。
必须应用三规则,即函数必须有一个 =operator,copy constructor 和 destructor。
Vector(const Vector&);
~Vector();
void operator=(const Vector&);
void Vector::operator=(const Vector& v)
{
for (int i = 0; i < m_dim; i++) {
m_t[i] = v.m_t[i];
}
}
注意:我使用的是 visual studio 社区 2019 C++14 编译器。
似乎以下程序正在尝试删除一个空位置。我在调用 + 运算符后尝试删除自定义向量 class...
这是代码:
class Vector
{
public:
Vector(const double* t, int dim) : m_dim(dim)
{
m_t = new double[dim];
for (int i = 0; i < dim; i++) {
m_t[i] = t[i];
}
}
~Vector() {
delete[] m_t;
}
Vector operator+(const Vector& v) {
Vector tmp{ v };
for (int i = 0; i < v.m_dim; i++) {
tmp.m_t[i] = tmp.m_t[i] + m_t[i];
}
return tmp;
}
private:
double* m_t;
int m_dim = 0;
};
int main() {
double t[] = { 1,2,3 };
Vector a{ t, 3 };
Vector b{ t, 3 };
Vector c{ t, 3 };
a = b + c;
// a answer is wrong,
// destructor, wntdll.pdb not loaded correctly
}
我认为该错误与 + 运算符在返回值之前删除“tmp”对象有关。我只是不知道如何解决它。我尝试用指针和“新”运算符替换它,但没有用。
感谢@AlZ23z 和@Ted Lyngmo 的回答。 必须应用三规则,即函数必须有一个 =operator,copy constructor 和 destructor。
Vector(const Vector&);
~Vector();
void operator=(const Vector&);
void Vector::operator=(const Vector& v)
{
for (int i = 0; i < m_dim; i++) {
m_t[i] = v.m_t[i];
}
}