gpt4 book ai didi

c++ - 为什么我们需要删除复制赋值运算符中的指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:03 25 4
gpt4 key购买 nike

我看过几个复制赋值运算符的例子,不明白为什么我们需要删除复制赋值运算符中的指针。例如,如果我有以下类(class)

 class MyClass
{
public:
MyClass(int a)
{
x = new int(a);
}
MyClass& operator=(const MyClass& pMyClass)
{
*x = *(pMyClass.x);

// ?????????
// delete x;
// x = new int(*(pMyClass.x));
}
~MyClass()
{
delete x;
}
private:
int* x;
}

*x = *(pMyClass.x) 行有什么问题?我只是复制 pMyClass.x 指向的对象,为什么我需要删除并重新创建它?。谁能举例说明此代码何时会导致内存泄漏?

最佳答案

所以这是一个用户定义 vector 类的复制赋值示例 [摘自 Bjarne Stroustrup 的“C++ 之旅(第 2 版)]:

Vector& Vector::operator=(const Vector& a) // copy assignment
{
double∗ p = new double[a.sz];
for (int i=0; i!=a.sz; ++i)
p[i] = a.elem[i];
delete[] elem; // delete old elements
elem = p; // here elem is the vector's data holding member array
sz = a.sz;
return ∗this;
}

要理解为什么在第 6 行我们有删除操作:

delete[] elem; // delete old elements

我们首先需要先了解拷贝构造函数和拷贝赋值的区别。在第一种情况(复制构造函数)中,我们创建了一个全新的对象,而在第二种情况(复制赋值,我们真正感兴趣的对象)中,我们已经有了一个现有对象,我们只想将另一个对象的内容复制到其中给定相同类型的对象。

鉴于我们已经有一个现有对象,我们首先需要清除它的内容,以便我们能够从我们打算复制的对象中复制所需的内容。

我希望这能回答您的问题。

关于c++ - 为什么我们需要删除复制赋值运算符中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28786364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com