运算符重载返回对象导致内存泄漏,C

运算符重载返回对象导致内存泄漏,C,第1张

概述我认为问题是当我重载 *** 作符时返回一个对象.我尝试返回对该对象的引用,但这样做并不能解决内存泄漏问题.我可以评论这两个陈述: dObj = dObj + dObj2; 和 cObj = cObj + cObj2; 释放内存泄漏程序.不知何故,问题是在重载 *** 作符后返回一个对象. #include <iostream> #include <vld.h> using namespace 我认为问题是当我重载 *** 作符时返回一个对象.我尝试返回对该对象的引用,但这样做并不能解决内存泄漏问题.我可以评论这两个陈述:

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,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,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",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;    }
解决方法 你需要声明复制构造函数,因为你在重载 *** 作符中返回对象,如果你没有明确定义它,编译器会自动为你生成一个,但编译器是愚蠢的,不能对指针进行深层复制

在发布的代码中总结您的错误:

1.)没有copy-Constructor / Assignment-Operator定义(释放异常/内存泄漏)
由于您正在处理指针,因此编译器生成的函数仅执行浅拷贝.
确保此类行为是有意为您的工作,否则请将其自行重新定义为:

Dog::Dog(const Dog& ref) :_name( strdup(ref._name) ),_gender( strdup(ref._gender) ),_age( ref._age ){}Dog& Dog::operator=(const Dog &dobj){    if (this != &dobj)    {        free (_name);        free (_gender);        _name = strdup( dobj._name );        _gender = strdup( dobj._gender );        _age = dobj._age;    }    return *this;}

2.)传入指针的处理不当(这里是内存泄漏)
您在验证输入参数的空状态之前执行了分配.
另外额外分配1个内存char是明智之举,但是在找到输入参数为null之后你不会释放它们.类似于上面的copy-constructor的简单修复将是:

Dog::Dog(const char * name,int age) :_name( strdup(name) ),_gender( strdup(gender) ),_age( age ){}

3.)分配器/解除分配器配对不当(此处存在潜在的内存泄漏)
使用new []的数组分配应该与数组释放delete []匹配,否则将无法正确处理数组元素的析构函数.
但是,为了与上面使用strdup(内部使用malloc)发布的示例代码一致,您的析构函数应如下所示:

Dog::~Dog(){    free (_name);    free (_gender);    _age = 0;}
总结

以上是内存溢出为你收集整理的运算符重载返回对象导致内存泄漏,C全部内容,希望文章能够帮你解决运算符重载返回对象导致内存泄漏,C所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1221812.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存