我有一个课程'记录'如下:
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 []。看到问题了?
答案 0 :(得分:2)
你违反了“五条规则”:如果你有以下任何一种,你可能需要写下所有其他四个:
请参阅:
动态数组的使用非常多,以至于某人已经完成了所有这些艰苦的工作。只需将bits
更改为std::vector<char>
,所有编译器生成的特殊成员函数都会做正确的事情。如果bits
指向Record
对象拥有的内存。如果您打算在许多对象之间共享内存,可以按照Seth在评论中的建议考虑shared_ptr
。但我怀疑你不想要任何分享。