我目前正在处理一个叫做Text的ADT,并且我正在重载赋值操作符。当我像这样测试操作符时:assignText = alpha,一切输出都正常。但是,当我执行assignText = assignText时,输出两个实心条。
assignText被声明为文本对象。
我的重载赋值操作符如下:
void Text::operator= (const Text& other) {
bufferSize = other.getLength();
buffer = new char[bufferSize];
buffer = other.buffer;
}int bufferSize和char *buffer在哪里
任何提示或建议都将不胜感激。如果还需要什么,尽管让我知道。
发布于 2012-09-09 06:47:09
其他答案已经指出了运算符实现的各种问题。在这里,我将尝试理解发生在你身上的事情,也就是为什么代码会在你观察到的时候表现出来。如果为this == &other,即在自赋值期间,则将当前长度作为新缓冲区的大小。这个新的缓冲区没有初始化,所以在这一点上它可能包含随机字节。如果是自赋值,则最后一个赋值是no-op。总结一下:
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
}因此,这告诉您,您最终得到了一个具有当前对象大小的缓冲区,但具有未定义的内容。在您的例子中,未定义的内容恰好表示您提到的竖条。
要解决此问题,请确保根据其他答案和注释中的建议修复赋值运算符。
发布于 2012-09-09 05:25:09
这是一个内存泄漏。您将两个不同的指针分配给buffer。
buffer = new char[bufferSize];
buffer = other.buffer; 发布于 2012-09-09 05:26:09
关于手头的问题,可以在C++常见问题解答:中找到。首先阅读FAQ通常是一个好主意。或者至少略读一下。
当您必须实现复制赋值操作符时,通常复制并交换习惯用法就足够好了。它也是异常安全的。是这样的:
void swapWith( MyType& other ) throw()
{
// swap them members
}
void operator=( MyType other )
{
swapWith( other );
}在这里,复制构造函数创建了形参copy,任何异常都会在这里发生,因此复制构造函数还会集中清理工作,以防复制失败。在此之后,两个对象的内容被交换,复制对象的析构函数负责清理该对象的内部内容。void结果类型还不是常规的,但在我看来,把代码和时间都浪费在支持有副作用的表达式上是不明智的,这是邪恶的。
现在,您只需使用std::vector作为,就可以避免所有这些。
所以这就是我推荐的,真正简单的解决方案:使用std::vector。
https://stackoverflow.com/questions/12334573
复制相似问题