![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
alexr3 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.6.2008 Репутация: нет Всего: нет |
Здесь APT_UString — это класс. А функция APT_ConvertFromUTF8String определена следующим образом:
|
||||
|
|||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Если APT_ConvertFromUTF8String создает новую строку в куче и возвращает указатель, то утечка имеет место.
В любом другом случае, можно спать спокойно |
|||
|
||||
alexr3 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.6.2008 Репутация: нет Всего: нет |
Так вот как раз не уверен, создает ли она новую строку. Все что у меня есть про эту функцию - это ее описание из .h. Но по логике вроде должна создавать: на входе получает UTF8, на выходе - двухбайтовый UTF. Где-то же она создает новую строку. Тогда что мне делать? Вот так? APT_UString **uKeys = new APT_UString*[keyNum]; for (int i=0; i < keyNum; i++){ /* xxxxx */ } /* some code here */ /* yyyyy */ Тогда как мне заменить строку /* xxxxx */? Функция возвращает не сам указатель, а приведенный к классу: APT_UString. И присваивание uKeys[i] = APT_ConvertFromUTF8String(*keys[i]); не прокатит. И как потом удалять uKeys? В цикле пробегаясь и делая delete для всех его элементов или просто delete[] для всего массива? Сразу уточню: ответы типа "напиши-собери-проверь" трудновыполнимы, так как это компонент другого большого приложение, которое будет просто вызывать функцию из obj-файла. И делаться это будет на Unix-сервере. В данном приложении возможности отладки крайне скудны. |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
||||
|
||||
alexr3 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.6.2008 Репутация: нет Всего: нет |
Э, я сам не совсем понимаю тонкостей: опыт работы с С++ небольшой. Но возвращатеся же не APT_UString*, а APT_UString. То есть где-то в теле функции, я подозреваю, есть что-то типа
А за ответ спасибо! Это сообщение отредактировал(а) alexr3 - 30.11.2010, 23:46 |
||||
|
|||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Перечитайте чтоли учебники по С++
Бессмыслено создавать new и передавать значение. Если APT_UString класс - то 99% что деструктор сам позаботица об удалении того чего нужно: |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
alexr3
Конструкции вроде этой (а именно new, вызов функции, delete) всегда должны настораживать. Если при вызове функции произойдет исключение, delete никогда не будет вызван. Надо следить за безопасностью исключений. Решение - использовать умные указатели (boost::scoped_array) или поставить try-catch. |
|||
|
||||
alexr3 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.6.2008 Репутация: нет Всего: нет |
Я, может быть не совсем точно выразился. Я не боюсь за то, что APT_UString::~APT_UString() не освободит буфер. Это уже, в конце концов, его задача и его проблем. Повлиять на него я не могу. Меня вот что заботит: Строкой
я же вроде создаю массив объектов APT_UString. Причем каждый элемент массива инициализируется вызовом APT_UString::APT_UString(). А потом строкой ниже
я присваваю элементам массива новые объекты. И ссылки на старые у меня теряются. И при вызове оператора delete[] деструктов APT_UString::~APT_UString() будет вызван лишь для новых значений массива. А старый останутся "болтаться" в памяти. Это так или я где-то ошибаюсь? |
||||||
|
|||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
alexr3 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.6.2008 Репутация: нет Всего: нет |
А, точно-точно! Я что-то это совсем упустил из виду. Это все Java меня приучила думать, что присваивание лишь передает указатели.
Теперь понятно, почему delete[] отработает корректно. Спасибо всем! ![]() Это сообщение отредактировал(а) alexr3 - 1.12.2010, 08:21 |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
-------------------- вопросов больше чем ответов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |