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

时间:2011-09-11 21:12:09

标签: c++ memory-management operator-overloading

我试图学习基本的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;

}

4 个答案:

答案 0 :(得分:1)

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

  • 为新的较大字符串,strcpy / cat分配内存,删除旧的str指针的内存,然后指定成员str指向新创建的较大字符串

答案 1 :(得分:1)

简单修复:

   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;

答案 2 :(得分:0)

应该在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&amp;来获取你的参数。此外,+运算符更好地实现为自由函数;无论是作为朋友还是基于成员+ =运营商。

答案 3 :(得分:0)

我知道这个练习的目的只是为了学习。我会避免在现实生活中创建这样的字符串类型。现在回到最初的问题,解决方案是始终使用RAII来管理资源,这可以通过不同的方式完成,但最简单的方法之一就是一起使用 copy-and-swap 使用规则的三个(我在几天前写过这篇文章here使用RAII管理资源意味着始终意味着你做不需要过多考虑如何以及何时释放它们。