Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

C++ Frage zur Speicherverwaltung

18.12.08 17:02
Re: C++ Frage zur Speicherverwaltung
 
  femidav завсегдатай
в ответ evgher 18.12.08 16:38
В плюсах своя специфика, и, исходя из представленного кода, я не вижу её понимания.
Какой код генерируется автоматически? Можно посмотреть на декларацию класса и реализацию перечисленных мною функций?
В ответ на:
Я думаю, что здесь вы не совсем правы. ms_address_field является мембер-переменной - указателем.

Разумееется я прав. Во-первых, почему вообще ms_address_field хранится в классе как указатель? Почему не по значению? Во-вторых, функция возвращает указатель на внутренности поля. Это плохо. Ещё того хуже, что эти внутренности возвращаются в виду указателя. Почему это плохо? Потому имея функцию вида const axis2_char_t *Options::getActionField(), мы не можем по её виду сказать имплементирована ли она так:
const axis2_char_t *Options::getActionField()
{
return (axis2_char_t *)ms_address_field->c_str();
}

или так:

const axis2_char_t *Options::getActionField()
{
return (axis2_char_t *) strdup( ms_address_field->c_str() );
}

Соотвественно мы не знаем, что мы должны делать с данным указателем, то ли потереть его с помощью free, то ли с помощью delete[], то ли оставить всё как есть. Вообще, raw pointer - в большинстве случае есть зло. Есть ссылки, есть значения, есть умные указатели. Обычно этого достаточно. В-третьих, здесь убирается const-qualifier с помощью сишного каста, что не только плохо, но и совершенно излишне.

В ответ на:
Уничтожение оной будет предпринято только при вызове деструктора - до этого ничего

Речь идёт не о том, как это может быть в идеальном случае. А о вот таком случае:
{
Options o;
axis2_char_t const * address = o.getActionField();
delete [] address;
} // приехали...

 

Перейти на