Где освободить память, выделенную в функции перегрузки оператора - PullRequest
0 голосов
/ 12 сентября 2011

Я пытался изучить основные концепции перегрузки операторов 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 ]

1 голос
/ 12 сентября 2011

Простое исправление:

   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;
1 голос
/ 12 сентября 2011

У вашего оператора конкатенации будут те же проблемы, что и у операторов присваивания, так что это будет полезным чтением: http://www.parashift.com/c++-faq-lite/assignment-operators.html

  • Выделите память для новой строки большего размера, strcpy / cat,удалите память старого указателя str, затем назначьте член str для указания на вновь созданную большую строку
0 голосов
/ 12 сентября 2011

Я понимаю, что цель упражнения - просто учиться.Я бы не стал создавать строковый тип в реальной жизни.Теперь вернемся к исходной проблеме, решение состоит в том, чтобы всегда использовать RAII для управления ресурсами, и это можно сделать разными способами, но один из самых простых - использовать copy-and-swap вместе с правило трех (я писал об этом всего пару дней назад здесь Использование RAII для управления ресурсами означает всегда означает, что вы этого не делаетенужно слишком много думать о том, как и когда вы должны их выпустить.

0 голосов
/ 12 сентября 2011

Память должна быть освобождена в деструкторе 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 &.Кроме того, оператор + лучше реализован как свободная функция;либо в качестве друга, либо в качестве члена + = оператор.

...