【发布时间】:2016-01-13 12:39:25
【问题描述】:
我尝试阅读了很多关于复制构造函数中发生内存泄漏的解决方案,但我仍然不明白如何解决它。
例如,我有一个“Person”类,它具有这些功能和功能(头文件):
#include "Object.h"
#include <string.h>
#include <iostream>
using namespace std;
class Person: public Object
{
private:
char * p_name;
int length;
public:
virtual Object * copy() const;
virtual void print(ostream & os) const;
Person(char * name);
Person(const Person & per);
~Person();
};
在这个程序中,我试图将“对象”输入到 Vector,而 Person 和 Vector 从 Object 继承。 在这两个副本中,我都有内存泄漏问题(程序运行良好)。
例如,在这段代码中,我得到了所有这 5 个字符数组的内存泄漏。我在 Vector 内存泄漏方面也有更多问题,但让我们从 main 中的这个简单代码开始(发生 5 次 char 数组的内存泄漏):
int main ()
{
const int SIZE = 5;
Person* persons[SIZE];
int i;
// preparation of name array
for (i = 0; i<SIZE; i++) {
char* tmp = new char[10];
sprintf(tmp, "P-%d", i);
persons[i] = new Person(tmp);
}
for (i = 0; i < SIZE; i++)
delete persons[i];
return 0;
}
Person 类是:
#include "Person.h"
using namespace std;
Object * Person::copy() const
{
Person * p = new Person(*this);
return p;
}
void Person::print(ostream & os) const
{
for (int i = 0; i < this->length-1; i++)
{
os << this->p_name[i];
}
}
Person::Person(char * name)
{
delete this->p_name;
this->length = strlen(name)+1;
p_name = new char[length];
strncpy(p_name, name, length);
}
Person::Person(const Person & per)
{
delete[] this->p_name;
this->length = strlen(per.p_name) + 1;
this->p_name = new char[this->length];
strncpy(this->p_name, per.p_name, this->length);
}
Person::~Person()
{
delete[] this->p_name;
}
感谢您的帮助!!
【问题讨论】:
-
如果你切换到
std::string,这会容易得多。 -
首先,您并没有删除您在 main 中分配的 tmp 数组,因此这可能是您遇到的内存泄漏之一。
-
你需要使你的析构函数虚拟(在你的
Object类以及你的Person类中)。 -
@Rabbid76 没有帮助。它仍然是未定义的行为,因为
p_name未初始化。 -
如果手动管理内存这个很难,你应该坚持
std::string和std::make_unique等,永远不要再使用new。
标签: c++ memory memory-management memory-leaks copy-constructor