首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++赋值重载自赋值问题

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

Stack Overflow用户
提问于 2012-09-09 05:17:47
回答 6查看 445关注 0票数 0

我目前正在处理一个叫做Text的ADT,并且我正在重载赋值操作符。当我像这样测试操作符时:assignText = alpha,一切输出都正常。但是,当我执行assignText = assignText时,输出两个实心条。

assignText被声明为文本对象。

我的重载赋值操作符如下:

代码语言:javascript
复制
void Text::operator= (const Text& other) { 
bufferSize = other.getLength();
buffer = new char[bufferSize];
buffer = other.buffer; 
}

int bufferSizechar *buffer在哪里

任何提示或建议都将不胜感激。如果还需要什么,尽管让我知道。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-09-09 06:47:09

其他答案已经指出了运算符实现的各种问题。在这里,我将尝试理解发生在你身上的事情,也就是为什么代码会在你观察到的时候表现出来。如果为this == &other,即在自赋值期间,则将当前长度作为新缓冲区的大小。这个新的缓冲区没有初始化,所以在这一点上它可能包含随机字节。如果是自赋值,则最后一个赋值是no-op。总结一下:

代码语言:javascript
复制
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
}

因此,这告诉您,您最终得到了一个具有当前对象大小的缓冲区,但具有未定义的内容。在您的例子中,未定义的内容恰好表示您提到的竖条。

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-09 05:25:09

这是一个内存泄漏。您将两个不同的指针分配给buffer

代码语言:javascript
复制
 buffer = new char[bufferSize];
 buffer = other.buffer; 
票数 1
EN

Stack Overflow用户

发布于 2012-09-09 05:26:09

关于手头的问题,可以在C++常见问题解答:中找到。首先阅读FAQ通常是一个好主意。或者至少略读一下。

当您必须实现复制赋值操作符时,通常复制并交换习惯用法就足够好了。它也是异常安全的。是这样的:

代码语言:javascript
复制
void swapWith( MyType& other ) throw()
{
    // swap them members
}

void operator=( MyType other )
{
    swapWith( other );
}

在这里,复制构造函数创建了形参copy,任何异常都会在这里发生,因此复制构造函数还会集中清理工作,以防复制失败。在此之后,两个对象的内容被交换,复制对象的析构函数负责清理该对象的内部内容。void结果类型还不是常规的,但在我看来,把代码和时间都浪费在支持有副作用的表达式上是不明智的,这是邪恶的。

现在,您只需使用std::vector作为,就可以避免所有这些

所以这就是我推荐的,真正简单的解决方案:使用std::vector

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12334573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档