gpt4 book ai didi

c++ - 复制构造函数中的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 15:35:36 25 4
gpt4 key购买 nike

我已经尝试阅读了很多关于复制构造函数中发生内存泄漏的解决方案,但我仍然不明白如何解决它。

例如,我有一个“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 内存泄漏方面也有更多问题,但让我们从主要的这个简单代码开始(char 数组发生 5 次内存泄漏):

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;
}

人类是:

#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;
}

非常感谢您的帮助!!

最佳答案

在 main() 中,tmp 字符数组没有被删除,这是我看到的第一个内存泄漏。

在 Person(char * name) 构造函数中调用 delete on

Person::Person(char * name)
{
delete this->p_name;

p_name 未分配,因此行为未定义。而p_name是一个数组,所以应该使用delete[]。

如果使用std::string类,至少可以避免delete和delete[]的混淆

关于c++ - 复制构造函数中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34766993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com