复制具有内存分配和释放的构造函数
Copy constractor with memory allocation and deallocation
我已经编写了以下代码
#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*而不是字符串,并动态分配内存。但是当我运行代码时,会出现内存泄漏的错误。我认为这是由于复制构造函数和驱动程序类的内存分配。如何修复错误?欢迎提出任何建议。提前谢谢。
这段代码有很多错误,但我将列出一些大的错误。
- 正如其他人所说,你的
new char
需要比他们大一点 - 默认构造函数应将name设置为nullptr
- 无论何时执行赋值,都会出现内存处理错误,例如在以下行:
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 ;
相关文章:
- 构造函数中发生异常时如何释放 API 使用的资源
- 如果在构造函数中发生异常,如何释放动态内存
- 复制赋值构造函数中的aligned_alloc内存块在释放时崩溃
- 如何安全地释放构造函数分配的资源
- C++复制构造函数上的双重释放错误
- 如果在构造函数引发异常后释放了分配的内存
- 当构造函数抛出时,数组不会在此处释放,对吧?
- 如何在SWIG中释放自定义构造函数中分配的内存
- C++构造函数上的向量释放
- 复制具有内存分配和释放的构造函数
- 使用复制构造函数和运算符重载 - "未分配正在释放的指针"
- C++ 异常的双重释放损坏错误(复制构造函数不起作用)
- 复制构造函数:释放存储时
- 通过使用不同的构造函数创建对象,并最终释放对象的内存
- 在构造函数中出现异常之前分配的内存没有被释放
- 动态数组释放(赋值操作符与复制构造函数)
- 为什么在构造函数调用异常后不释放unique_ptr
- c++双精度释放或损坏(out):即使使用复制构造函数和赋值操作符
- 被释放的指针没有在构造函数中分配 realloc 和 malloc
- C++, Qt :释放在构造函数中创建的"non attribute"对象