首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们需要删除C++赋值操作符中分配的内存?

为什么我们需要删除C++赋值操作符中分配的内存?
EN

Stack Overflow用户
提问于 2011-07-17 16:11:59
回答 5查看 2.6K关注 0票数 1

为什么我们需要delete语句?

代码语言:javascript
复制
const MyString& operator=(const MyString& rhs)
{ 
    if (this != &rhs) {
        delete[] this->str; // Why is this required?
        this->str = new char[strlen(rhs.str) + 1]; // allocate new memory
        strcpy(this->str, rhs.str); // copy characters
        this->length = rhs.length; // copy length
    }
    return *this; // return self-reference so cascaded assignment works
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-17 16:16:18

这不是复制构造函数,它是赋值运算符。您需要删除,因为要分配的对象已保存以前的值。

这段代码也不是很好,因为首先删除旧值,然后分配新值……但分配可能会抛出异常,在这种情况下,对象将保留一个指向已释放区域的指针。一种更好的方法是先分配,然后删除旧值(永远不允许异常从析构函数中转义...see this link for an explanation),因此分配要么成功,要么失败,不会影响任何东西。

一种常见的习惯用法是实现一个复制构造函数和一个交换操作(交换两个实例的内容,以保证不会抛出异常)。然后实现assignment operator combining the two...从异常处理的角度来看,这既需要更少的代码,又是健壮的。

票数 11
EN

Stack Overflow用户

发布于 2011-07-17 16:51:15

答案是你必须释放内存,因为如果你没有释放内存,那么它就会丢失,因为你正在为新的分配重用指针。无论如何,如果你正在学习运算符,通常会以复制构造+无抛出交换的方式编写operator=

代码语言:javascript
复制
class MyString {
   char* str;
   int len;
public:
   MyString( const MyString& rhs ) : str( new char[ rhs.len ] ), len( rhs.len ) {
      memcpy( str, rhs.str, len );
   }
   ~MyString() {
      delete str;
   }
   friend void swap( MyString & lhs, MyString & rhs ) throw() {
      using std::swap;
      swap( lhs.str, rhs.str );
      swap( lhs.len, rhs.len );
   }
   MyString& operator=( MyString rhs ) { //note: by value
      swap( *this, rhs );
      return *this;
   }
};

请注意,执行的操作是相似的。现在的区别是:

  • 总体代码较少。复制时需要执行的任何操作将只在复制构造函数中实现,赋值操作符借用该代码。
  • 不需要检查自分配,因为复制是在旧内存释放之前执行的
  • 此实现是异常安全的:如果分配内存(或复制构造函数中的任何其他操作)时存在问题,则操作没有副作用
  • 自分配性能较差,因为新内存被分配,然后复制并释放。但是从临时值(右值表达式)赋值会更快,因为编译器可以省略副本。只有当测量结果指向代码中的瓶颈时,才应该考虑静态性能。
票数 5
EN

Stack Overflow用户

发布于 2011-07-17 16:16:17

这不是复制构造函数。这只是一个复制操作符。所以这个->str将指向以前分配的内存。如果在这个->字符串被赋予新值之前没有释放内存,那么它将永远不会被释放,因为它唯一引用已经被覆盖。因此,如果没有delete语句,该方法将泄漏内存。

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

https://stackoverflow.com/questions/6722643

复制
相关文章

相似问题

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