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