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

标签 c++ memory memory-management memory-leaks copy-constructor

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

例如,我有一个“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/

相关文章:

c++ - 连接器错误问题

c++ - 使用对象的浅拷贝时出现双重释放错误......如何解决?

c - 新手 C 程序员如何检测内存泄漏

c++ - 文件读取停止

c++ - Visual Studio 可以告诉我哪个断言失败了吗?

java - 在Java中,如何分配给定数量的内存,并保留它直到程序退出?

java - 单链表清空后仍然消耗内存

C++ std::shared_ptr,是否重载了 operator= 以使用复制构造函数?

c - 将参数传递给多个线程

android - 无法转换为 c\c++ 项目 eclipse ndk cocos2dx