运算符重载返回对象导致内存泄漏,C
发布时间:2020-12-16 10:39:31 所属栏目:百科 来源:网络整理
导读:我认为问题是当我重载操作符时返回一个对象.我尝试返回对该对象的引用,但这样做并不能解决内存泄漏问题.我可以评论这两个陈述: dObj = dObj + dObj2; 和 cObj = cObj + cObj2; 释放内存泄漏程序.不知何故,问题是在重载操作符后返回一个对象. #include iostr
我认为问题是当我重载操作符时返回一个对象.我尝试返回对该对象的引用,但这样做并不能解决内存泄漏问题.我可以评论这两个陈述:
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.)传入指针的处理不当(这里是内存泄漏) Dog::Dog(const char * name,int age) : _name( strdup(name) ),_gender( strdup(gender) ),_age( age ) { } 3.)分配器/解除分配器配对不当(此处存在潜在的内存泄漏) Dog::~Dog() { free (_name); free (_gender); _age = 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |