Использование оператора + без утечки памяти? - PullRequest
3 голосов
/ 19 января 2010

Таким образом, рассматриваемый код такой:

const String String::operator+ (const String& rhs)  
{  
    String tmp;  
    tmp.Set(this->mString);  
    tmp.Append(rhs.mString);  
    return tmp;  
}  

Это, конечно, помещает строку в стек, и она удаляется и возвращает мусор. И размещение его в куче приведет к утечке памяти. Так как мне это сделать?

Ответы [ 4 ]

11 голосов
/ 19 января 2010

Ваше решение не возвращает мусор, если у вас есть конструктор рабочей копии - объект String tmp копируется в объект результата до того, как он будет уничтожен в конце блока.

Вы могли бы сделать это лучше, заменив

String tmp;
tmp.Set(this->mString);

с

String tmp(*this);

(для этого вам нужен правильно работающий конструктор копирования, но он все равно нужен для вашего return оператора)

4 голосов
/ 19 января 2010

Вы должны реализовать конструктор копирования, оператор присваивания копии и деструктор в соответствии с правилом о трех . Затем выделенное в стеке временное хранилище будет безопасно скопировано в хранилище, приняв возвращаемое значение.

1 голос
/ 19 января 2010

если вы используете std :: string, это ни утечка, ни возврат мусора

есть ли в вашем классе конструктор копирования (это работает)

В любом случае он не протечет (если только String не очень плохой)разработан, т.е. не освобождает внутреннюю память, когда вызывается его деструктор)

0 голосов
/ 19 января 2010

Нет утечки памяти. Но вы можете изменить тип возвращаемого значения на String вместо "const String". В противном случае эта функция будет бесполезна

...