📜  C ++ |析构函数|问题5(1)

📅  最后修改于: 2023-12-03 14:39:38.583000             🧑  作者: Mango

C++ | 析构函数 | 问题5

在C++中,析构函数(Destructor)是一种与构造函数相对应的特殊成员函数,它会在对象被销毁时自动调用。

问题描述

在某个C++程序中,有一个类MyClass,其中定义了一个析构函数。但程序在执行时发生了奇怪的问题,需要找到解决方法。

class MyClass {
public:
    ~MyClass() {
        delete pInt;
    }
private:
    int *pInt = new int(10);
};
问题分析

在析构函数中,我们使用了delete操作符,释放了pInt指向的内存空间。然而,注意到我们在类内部为pInt指针变量赋值时使用了new运算符,因此该指针指向的内存空间是动态分配的。也就是说,如果MyClass对象被复制或赋值,不同的对象将会指向同一块内存空间,从而导致多次释放同一块内存空间的问题。

因此,我们需要在类中启用拷贝构造函数和拷贝赋值运算符,以确保MyClass对象的复制和赋值操作都能正确处理指针成员。

class MyClass {
public:
    MyClass() : pInt(new int(10)) {}
    ~MyClass() {
        delete pInt;
    }

    // 拷贝构造函数
    MyClass(const MyClass &other) : pInt(new int(*other.pInt)) {}
    // 拷贝赋值运算符
    MyClass& operator=(const MyClass &rhs) {
        if (this != &rhs) {
            *pInt = *rhs.pInt;
        }
        return *this;
    }
private:
    int *pInt;
};
解决方案

修改MyClass类的定义,加入拷贝构造函数和拷贝赋值运算符,确保MyClass对象的复制和赋值操作都能正确处理指针成员。

class MyClass {
public:
    MyClass() : pInt(new int(10)) {}
    ~MyClass() {
        delete pInt;
    }

    // 拷贝构造函数
    MyClass(const MyClass &other) : pInt(new int(*other.pInt)) {}
    // 拷贝赋值运算符
    MyClass& operator=(const MyClass &rhs) {
        if (this != &rhs) {
            *pInt = *rhs.pInt;
        }
        return *this;
    }
private:
    int *pInt;
};
总结

在C++中,如果定义了析构函数,则应该同时考虑拷贝构造函数和拷贝赋值运算符的实现,以确保对象的复制和赋值操作都能正确处理成员变量,避免因内存操作导致的程序错误。