
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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)