c++ - operator+ 重载返回对象导致内存泄漏,C++

标签 c++

我认为问题在于当我重载 + 运算符时返回一个对象。我尝试返回对该对象的引用,但这样做并不能解决内存泄漏问题。我可以注释掉这两个语句:

dObj = dObj + dObj2;

cObj = cObj + cObj2;

释放内存泄漏的程序。不知何故,问题在于重载 + 运算符后返回一个对象。

    #include <iostream>
    #include <vld.h>

    using namespace std;

    class Animal
    {
    public :
        Animal() {};
        virtual void eat()  = 0 {};
        virtual void walk() = 0 {};
    };

    class Dog : public Animal
    {
    public :
        Dog(const char * name, const char * gender, int age);
        Dog() : name(NULL), gender(NULL), age(0) {};

        virtual ~Dog();
        Dog operator+(const Dog &dObj);

    private :
        char * name;
        char * gender;
        int age;
    };

    class MyClass
    {
    public :
        MyClass() : action(NULL) {};
        void setInstance(Animal &newInstance);
        void doSomething();

    private :
        Animal * action;
    };


    Dog::Dog(const char * name, const char * gender, int age) :  // allocating here, for data passed in ctor
            name(new char[strlen(name)+1]), gender(new char[strlen(gender)+1]), age(age)
    {
        if (name)
        {
            size_t length = strlen(name) +1;
            strcpy_s(this->name, length, name);
        }
        else name = NULL;
        if (gender)
        {
            size_t length = strlen(gender) +1;
            strcpy_s(this->gender, length, gender);
        }
        else gender = NULL;
        if (age)
        {
            this->age = age;
        }
    }
    Dog::~Dog()
    {
        delete name;
        delete gender;
        age = 0;
    }

    Dog Dog::operator+(const Dog &dObj)
    {
        Dog d;
        d.age = age + dObj.age;
        return d;
    }

    void MyClass::setInstance(Animal &newInstance)
    {
        action = &newInstance;
    }
    void MyClass::doSomething()
    {
        action->walk();
        action->eat();  
    }
    int main()
    {
        MyClass mObj;

        Dog dObj("Scruffy", "Male", 4); // passing data into ctor
        Dog dObj2("Scooby", "Male", 6);

        mObj.setInstance(dObj); // set the instance specific to the object.
        mObj.doSomething();  // something happens based on which object is passed in

        dObj = dObj + dObj2; // invoke the operator+ 
        return 0;
    }

最佳答案

如果您要进行自己的内存管理(您不应该;使用std::string!),您需要确保您的类具有以下用户定义的函数:

  • 析构函数
  • 复制构造函数
  • 赋值运算符

(此外,您通常也会有一个用户定义的构造函数)

您有一个用户定义的析构函数(认为您需要使用数组 delete[],而不是标量 delete),但您没有用户-定义了复制构造函数或赋值运算符,所以任何时候你复制一个对象或分配一个对象,它最终都会进行成员复制。然后两个对象具有相同的指针,当它们都被销毁时,指针被删除两次——这是一个很大的禁忌。

关于c++ - operator+ 重载返回对象导致内存泄漏,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2604748/

相关文章:

c++,我可以使用 enable_if 而不是复制粘贴来启用多个特征类特化吗?

c++ - 如何包含 glew32.dll 而不必将其放入系统根目录

c++ - QuickFix C++ 和 SSL : Issue connecting to LMAX using sTunnel

c++ - 如何避免意外地按值而不是按引用获取数组元素?

c++ - QBitArray移位

c++ - 使一个对象等于另一个对象

c++ - 如何实现您自己的自定义 DirectShow 渲染器?

c++ - CUDA 动态索引

c++ - 读取多行文本直到空行

c++ - OpenSSL 解密 - EVP_DecryptFinal_ex 失败