C++赋值重载自赋值问题

标签 c++ pointers operator-overloading

我目前正在开发一个名为 Text 的 ADT,并且正在重载赋值运算符。当我像这样测试运算符时:assignText = alpha 一切输出正常。但是,当我执行 assignText = assignText 时,则会输出两个实心条。

assignText 被声明为一个文本对象。

我的重载赋值运算符如下:

void Text::operator= (const Text& other) { 
bufferSize = other.getLength();
buffer = new char[bufferSize];
buffer = other.buffer; 
}

其中 int bufferSizechar *buffer

如有任何提示或建议,我们将不胜感激。如果还需要什么,请告诉我。

最佳答案

其他答案已经指出了您的运营商实现的各种问题。在这里,我将尝试了解您正在发生的事情,即为什么代码的行为与您观察到的一样。如果 this == &other,即在自赋值期间,您将当前长度作为新缓冲区的大小。该新缓冲区未初始化,因此此时它可能包含随机字节。在自赋值的情况下,最后一个赋值是空操作。总结一下:

void Text::operator= (const Text& other) { 
  bufferSize = other.getLength(); // Take length from current object
  buffer = new char[bufferSize];  // Create new buffer, old buffer turns into a memory leak
  buffer = other.buffer;          // No-op as both are the same variable
}

所以这告诉你的是,你最终得到一个当前对象大小的缓冲区,但有未定义的内容。在您的情况下,未定义的内容恰好代表您提到的竖线。

要解决此问题,请确保根据其他答案和评论的建议修复赋值运算符。

关于C++赋值重载自赋值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334573/

相关文章:

c++ - 重载 >> 运算符

c++ - iOS 和 C++ MVC 策略

C - 修改 const 结构内指针的数据

c++ - 返回其自身类型的模板类方法的正确签名

没有返回值的c++类成员运算符定义

arrays - char *array 和 char array[] 之间的内存区别是什么?

c++ - 在 C 代码中注册 C++ 回调方法

c++ - 构造函数依赖注入(inject) : unique_ptr + move vs shared_ptr

C++ 在具有 float 组的结构的二维 vector 上使用删除

c - 搜索指针数组以计算字母使用次数