weixin_67207019 2023-06-24 22:08 采纳率: 0%
浏览 12

C++赋值运算符重载

赋值运算符重载=赋值本身时存在问题
如p1= p1;

#include<iostream>
using namespace std;
 class Person
 {
public:
    Person(int a )
   {
    m_Age = new int (a);   // new int 返回 int *指针

   } 
   ~Person()
   {
    if (m_Age != NULL)
    {
        delete m_Age;
        m_Age = NULL;
    }
   }
   Person& operator=(Person &p)
   {
    if (m_Age != NULL)
    {
        delete m_Age;
        m_Age = NULL;
    }
    m_Age = new int (*p.m_Age);  //  这一行重要p.m_Age是一个指针,指向传入的值,
                                         //再解引用,新开一个空间使m_Age指向这个值而不是指向指针
    return *this;
   }                                                             
   int *m_Age;
 };
 void test01()
{
    Person p1(55);

    Person p2(20);

    Person p3(30);
    // p3 = p2 = p1; //赋值操作
    p1 = p1;

    cout << "p1的年龄为:" << *p1.m_Age << endl;

    cout << "p2的年龄为:" << *p2.m_Age << endl;

    cout << "p3的年龄为:" << *p3.m_Age << endl;
}
main()
{
    test01();
    system("pause");
    return 0;
}
if (m_Age != NULL)
    {
        delete m_Age;
        m_Age = NULL;
    }

把这段代码注释了就不报错,看起来像是拷贝之前把自身删除了
那么这段代码的必要性在哪能体现出来,或者怎么解决?

  • 写回答

3条回答 默认 最新

  • 易只轻松熊 2023-06-24 22:21
    关注

    出现问题的原因是在赋值运算符重载函数中,在删除m_Age指针之前检查了它是否为NULL。这样做的目的是为了避免重复删除指针导致的问题。然而,在执行p1 = p1; 这样的自我赋值操作时,由于指针没有发生改变,m_Age指向的内存块实际上没有被删除,因此删除操作是多余的。这可能导致了问题的出现。

    解决这个问题的一种方法是在赋值运算符重载函数中添加自我赋值检查。可以在赋值运算符重载函数中添加以下代码:

    if (&p == this) {
    return *this; // 如果是自我赋值,直接返回当前对象
    }

    这样,当进行自我赋值操作时,函数将直接返回当前对象,而不会进行后续的删除和内存分配操作。

    另外,为了确保在删除指针之后将其设置为NULL,可以在删除m_Age指针之后立即将其设置为NULL,而不是在条件判断中。例如:

    delete m_Age;
    m_Age = NULL;

    这样可以确保在删除指针之后,m_Age指针始终是NULL。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月24日