【发布时间】:2013-12-03 12:37:01
【问题描述】:
我写了以下代码
#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* 而不是字符串并动态分配内存。但是当我运行代码时,会出现内存泄漏的错误。我认为这是由于驱动程序类的复制构造函数和取消分配内存。如何修复错误?任何建议表示赞赏。提前致谢。
【问题讨论】:
-
你没有遵循三法则,而且,
delete nullptr;是一个空操作。 -
delete [] name;,不是delete name; -
您总是分配一个
char太少;请记住,C 风格的字符串有一个终止符0。 -
删除[]名称;并删除名称;导致相同的结果,粉碎:(
-
在默认构造函数中将name初始化为NULL
标签: c++ memory-management copy-constructor allocation