类对象赋值 - c ++

时间:2012-02-20 04:25:46

标签: c++

我有一个课程'记录'如下:

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 []。看到问题了?

1 个答案:

答案 0 :(得分:2)

你违反了“五条规则”:如果你有以下任何一种,你可能需要写下所有其他四个:

  • 用户定义的复制构造函数
  • 用户定义的移动构造函数
  • 用户定义的赋值运算符
  • 用户定义的移动分配运算符
  • 用户定义的析构函数

请参阅:


动态数组的使用非常多,以至于某人已经完成了所有这些艰苦的工作。只需将bits更改为std::vector<char>,所有编译器生成的特殊成员函数都会做正确的事情。如果bits指向Record对象拥有的内存。如果您打算在许多对象之间共享内存,可以按照Seth在评论中的建议考虑shared_ptr。但我怀疑你不想要任何分享。