类的动态分配
Dynamic allocation of classes
我有一个关于对象数组分配的问题, 问题是这样的: 我有一个名为 person 的类:
class Person {
char* name;
int ID;
public:
Person(char* name = NULL, int ID = 0) :name(name), ID(ID) {};
}
我试图像这样制作一系列人:
Person *pArr = new Person[size];
之后我从文件中提取数据(char* 表示字符串,int 表示 ID( 我使用 for 循环和构造函数将人员放置在循环中,如下所示:
for (int j = 0; j < size3; j++) {
pArr[j] = Person(Name, id);
}
完成程序后,我想使用析构函数并释放存储在 char* 名称中的分配字符串,但是当我添加析构函数时,它会在循环结束后立即触发, 每个被创造的人都会立即被摧毁, 我知道可以制作一个指针数组并分配人员,但是在这个任务中,我应该这样做, 有没有一种正确的方法可以在不立即触发析构函数的情况下做到这一点?
在这一行:
pArr[j] = Person(Name, id);
您正在创建一个临时Person
对象,然后将其分配给pArr[j]
对象。Person
没有定义显式复制赋值运算符,因此编译器会自动生成一个运算符,它只是执行值从一个对象到另一个对象的成员逐个成员复制。
当临时;
超出范围时,它会自动销毁。 编译器生成的赋值运算符将name
指针按原样复制到pArr[j]
对象,因此,如果Person
具有释放其name
的析构函数,则pArr[j]
对象将留下一个悬空的name
指向释放内存的指针。
您的Person
类不遵循三法则:
法则或三巨头法则(是C++(在C++11之前(的经验法则,它声称如果一个类定义了以下一项(或多项(,则可能应该明确定义所有三个:
- 破坏者
- 复制构造函数
- 复制赋值运算符
由于您希望Person
有一个释放name
的析构函数,它还需要一个复制构造函数和一个复制赋值运算符,以便它可以复制name
以供析构函数释放,例如:
class Person
{
char* name;
int id;
public:
Person(const char* Name = NULL, int ID = 0)
: name(new char[std::strlen(Name)+1]), id(ID)
{
std::strcpy(name, Name);
}
Person(const Person &src)
: name(new char[std::strlen(src.name)+1]), id(src.id)
{
std::strcpy(name, src.name);
}
~Person()
{
delete[] name;
}
Person& operator=(const Person &rhs)
{
if (&rhs != this)
{
Person tmp(rhs);
//std::swap(tmp.name, name);
char *p = tmp.name;
tmp.name = name;
name = p;
id = tmp.id;
}
return *this;
}
};
现在,回到这一行:
pArr[j] = Person(Name, id);
临时文件将被安全正确地复制到pArr[j]
。 请注意,如果您事先动态分配Name
,现在必须事后释放它,因为Person
会制作自己的内部副本。
如果可以将char*
更改为std::string
,那么您不必担心编译器会制作默认副本,因为std::string
符合三法则并且可以正确复制:
class Person
{
std::string name;
int id;
public:
Person(const std::string &name = std::string(), int ID = 0)
: name(name), id(ID)
{
}
// no explicit copy constructor, destructor, or
// assignment operator is needed, as compiler-generated
// defaults will suffice...
};
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存