我有一个“记录”类,如下所示:
class Record {
private:
char *bits;
char* GetBits ();
void SetBits (char *bits);
void CopyBits(char *bits, int b_len);
public:
Record ();
~Record();
}
我有一个 Record 对象数组,如下所示:
Record *recBuffer = new (std::nothrow)Record[RECORD_SIZE];
假设 recBuffer 已经填充了值。当我打印它们时,它们很好。以下代码可能有什么问题?
Record *newPtr = new (std::nothrow) Record[2*RECORD_SIZE];
if (NULL == newPtr) {
return;
}
//copy everything
for (int i = 0; i < RECORD_SIZE; i++) {
newPtr[i] = recBuffer[i];
}
delete[] recBuffer;
recBuffer = newPtr;
当我尝试打印 recBuffer 的值直到 RECORD_SIZE 时,前几个值已损坏,最后出现段错误!
所以,我正在用 Ben 的回答更新帖子: 因此,如果您复制一个 Record(复制位指针),(newPtr[i] = recBuffer[i]) 它们都将使用相同的指针调用 delete[]。发现问题了吗?
最佳答案
你违反了“五原则”:如果你有以下任何一项,你可能需要写下所有其他四项:
- 用户定义的拷贝构造函数
- 用户定义的移动构造函数
- 用户定义的赋值运算符
- 用户定义的移动赋值运算符
- 用户定义的析构函数
参见:
- What is The Rule of Three?
- Rule-of-Three becomes Rule-of-Five with C++11?
- How to actually implement the rule of five?
动态数组的使用如此之多以至于有人已经完成了所有这些艰苦的工作。只需更改 bits
到 std::vector<char>
所有编译器生成的特殊成员函数都会做正确的事情。如果bits
指向 Record
拥有的内存目的。如果你打算在多个对象之间共享内存,你可以考虑 shared_ptr
正如赛斯在评论中所建议的那样。但我怀疑您不想要任何共享。
关于c++ - 类对象赋值 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9356171/