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

标签 c++ assignment-operator

我看过几个复制赋值运算符的例子,不明白为什么我们需要删除复制赋值运算符中的指针。例如,如果我有以下类(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/

相关文章:

Ruby 最小最大赋值运算符

c++ - 在C++中快速将基对象的所有成员分配给派生对象

c++ - 强制 C++ 类实例在复制或分配时更改成员值

c++ - 提升语言环境的特定于语言环境的 to_lower 问题

c++ - 怪物阵列无法按我需要的方式工作

c++ - 显示 openGL 后删除文本

c++ - 如何在没有 operator=() 的情况下为 const 成员 push_back?

C++:无法从相同类型的常量初始化枚举值

c++返回保存在已删除动态对象中的字符串

c++ - 可以(重新)分配来自不同容器的迭代器吗?