复制具有内存分配和释放的构造函数

Copy constractor with memory allocation and deallocation

本文关键字:释放 构造函数 分配 内存 复制      更新时间:2023-10-16

我已经编写了以下代码

#include<iostream>
#include<cstring>
using namespace std;
///Driver class
class driver
{
    char *name;
    int age;
public:
    //Default contructor
    driver(){}
    //Constructor for initialize
    driver(int a, char* n)
    {
        age = a;
        int len = strlen(n);
        //Allocate memory for name
        name = new char[len];
        strcpy(name, n);
    }
    //Copy constructor
    driver(const driver &d)
    {
        name = new char[strlen(d.name)];
        strcpy(name, d.name);
        age = d.age;
    }
    void print()
    {
        cout<<"Name: "<<name<<endl;
        cout<<"Age: "<<age<<endl;
    }
    ~driver()
    {
        if(name != NULL)
        {
            delete name;
        }
    }
};
class automobile
{
    driver drv;
    char* make;
    int year;
public:
    automobile(driver d, char* m, int y)
    {
        drv = d;
        int len = strlen(m);
        make = new char[len];
        strcpy(make, m);
        year = y;
    }
    void print()
    {
        drv.print();
        cout<<"Make: "<<make<<endl;
        cout<<"Year: "<<year<<endl;
    }
    ~automobile()
    {
        if(make!=NULL)
        {
            delete[] make;
        }
    }
};
int main()
{
    driver d(15, "Jakir");
    automobile a(d, "Toyta", 1980);
    a.print();
    return 0;
}

我必须使用char*而不是字符串,并动态分配内存。但是当我运行代码时,会出现内存泄漏的错误。我认为这是由于复制构造函数和驱动程序类的内存分配。如何修复错误?欢迎提出任何建议。提前谢谢。

这段代码有很多错误,但我将列出一些大的错误。

  1. 正如其他人所说,你的new char需要比他们大一点
  2. 默认构造函数应将name设置为nullptr
  3. 无论何时执行赋值,都会出现内存处理错误,例如在以下行:drv = d;,因为它调用了默认运算符=,这在您的情况下是不正确的。三大定律松散地指出,每当你需要一个(非平凡的)复制构造函数、复制赋值运算符或析构函数时,你很可能也需要实现其他的。你需要写一个运算符=

根据现有的代码,我希望您的操作员=看起来像这样模糊:

//assignment operator
const driver&operator=(const driver &rhs)
{
    if (this==&rhs) return *this;
    delete[] this->name;
    this->name = new char[strlen(rhs.name)+1];
    strcpy(this->name, rhs.name);
    this->age = rhs.age;
    return *this;
}

做所有这些,你的核心垃圾就会消失。

PS拜托,请学会使用std::string,新的ing-char数组,自己管理内存是一个糟糕的举动。

name = new char[len+1];而非name = new char[len];

name = new char[strlen(d.name) + 1];而非name = new char[strlen(d.name)];

delete[]而非delete

需要定义一个赋值运算符driver& operator=(const driver &d)才能遵循三的规则。

automobile需要进行类似的更改。

然而,我没有看到内存泄漏,是什么让你认为你有内存泄漏?

在主方法中,您需要这样做,

driver* d = new driver(15, "Jakir");
automobile* a = new automobile (d, "Toyta", 1980);
a->print();
if ( a ) delete a ;
if ( d ) delete d ;
return 0 ;