释放在函数重载操作符中分配的内存

Where to free the memory allocated in functions overloading operator

本文关键字:分配 内存 操作符 函数 重载 释放      更新时间:2023-10-16

我试图学习基本的c++操作符重载概念。我有一个类mystring和相关的代码如下所示。在用于重载'+'操作符的函数中,我可以在哪里释放内存以避免内存泄漏。

#include <iostream>

class mystring
{
    char *ptr;
    public:
   mystring(char *str = "")
   {
      ptr = new char[strlen(str) + 1]
      strcpy(ptr,str);
   } 
   mystring operator +(mystring s)
   {
      char *str = new char[strlen(ptr) + strlen(s.ptr) + 1];//where should this memory be freed
      strcpy(str,ptr);
      strcat(str,s.ptr);
      return mystring v1(str);
   }
   ~mystring()
   {
      delete [] ptr; 
   }
};
int main()
{
   mystring a="Hello",b="World",c;
  c = a + b;
}

简单修复:

   mystring operator +(mystring s) 
   { 
      char *str = new char[strlen(ptr) + strlen(s.ptr) + 1];//where should this memory be freed 
      strcpy(str,ptr); 
      strcat(str,s.ptr); 
      mystring v1(str);
      delete[] str;
      return v1
   }

或者有一个私有构造函数

MyStr(char *str, bool dummy)
{
   ptr =  str;
}
然后

....strcat().
   mystring v1(str, false);
   return v1;

您的连接操作符将有与赋值操作符相同的问题,因此这将是一个有用的读取:http://www.parashift.com/c++-faq-lite/assignment-operators.html

  • 为新的大字符串分配内存,将strcpy/cat放入其中,删除旧str指针的内存,然后将成员str赋值给指向新创建的大字符串

内存应该在mystring的析构函数中释放,但是您需要重新考虑一下您的设计。

mystring operator +(mystring s)
{
    mystring result;
    result.ptr = new char[strlen(ptr) + strlen(s.ptr) + 1];
    strcpy(result.ptr,ptr);
    strcat(result.ptr,s.ptr);
    return result;
}

注意,您需要一个默认构造函数来创建空字符串。此外,还必须处理ptr资源,并添加适当的复制构造函数、赋值操作符和析构函数。除此之外,你应该通过const&来获取你的参数。此外,+运算符更好地实现为自由函数;作为友元或基于成员+=操作符

我明白练习的目的只是为了学习。在现实生活中,我会避免创建这样的字符串类型。现在回到原来的问题,解决方法是总是使用RAII管理资源,可以以不同的方式完成,但是一个最简单的一个是使用 copy-and-swap 规则三(我写了,就在几天前在这里使用RAII管理的资源意味着随时意味着你不需要认为太难如何以及何时你必须释放他们。