c++ - 类对象赋值 - C++

标签 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[]。发现问题了吗?

最佳答案

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

  • 用户定义的拷贝构造函数
  • 用户定义的移动构造函数
  • 用户定义的赋值运算符
  • 用户定义的移动赋值运算符
  • 用户定义的析构函数

参见:


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

关于c++ - 类对象赋值 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9356171/

相关文章:

c++ - 无法访问类 'CCustomCommandLineInfo' 中声明的私有(private)成员

c++ - Min-Max堆删除最大元素

c++ - 对新对象使用相同的引用

c++ - 如何转发声明在命名空间中的类

c++ - 为什么我的 C++ 映射实现不存储值?

c++ - 防止SC_METHOD在没有事件/触发的情况下执行

c++ - 重载运算符 <<(模板化)时如何修复 "ambiguous overload"错误?

c++ - 如何在 C++ 中混合原子和非原子操作?

c++ - std::wstring::find() 在 g++ 中损坏?

c++ - 在qt/linux中如何获取ip地址?