Login
C++ Frage zur Speicherverwaltung
634 просмотров
Перейти к просмотру всей ветки
femidav завсегдатай
in Antwort evgher 17.12.08 14:30
В ответ на:
Der Zeiger *str ist lokal und wird gelöscht sobald die Funktion zu Ende ausgeführt wurde.
Besteht die Möglichkeit die Freigabe über m_action_field durhchzuführen?
Der Zeiger *str ist lokal und wird gelöscht sobald die Funktion zu Ende ausgeführt wurde.
Besteht die Möglichkeit die Freigabe über m_action_field durhchzuführen?
Это локальная переменная str будет при выходе из функции уничтожена, а вот резервированный на куче std::string будет болтаться в памяти до конца жизни программы. Утечка памяти налицо.
Законно освободить память по m_action_field ты не можешь. У нас вообще нет гарантий, что str->c_str() показывает на отдельно резервированный кусок памяти. Это может быть просто пуффер внутри std::string (так называемая small string optimization). Так что ты либо будешь пытаться освободить невелидный кусок кучи, либо (если бы у нас все же была возможность освободить память занимаемую str) ты получишь двойную попытку освобождения одного и того же участка кучи.
Для дупликации сишных стрингов используй функцию strdup. Но ещё лучше использовать поля типа std::string. Если же ты используешь поля типа char*, то тебе надо так же правильно имплементировать деструктор, копирующий конструктор и оператор присваивания. Я сомневаюсь, что твоя квалификация позволит тебе это сделать. Поэтому используй std::string, пока не будешь знать язык настолько хорошо, что будешь чётко понимать, когда от него можно отказаться.
Кроме того, не передавай std::string по значению. Это вызывает ненужное копирование параметра. Правильно было бы так: void Options::setActionField(std::string const& addr);