Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Гляньте, плиз, нет ли здесь утечек памяти, Сам не уверен никак 
V
    Опции темы
alexr3
Дата 30.11.2010, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.6.2008

Репутация: нет
Всего: нет



Код

APT_UString *uKeys = new APT_UString[keyNum];

for (int i=0; i < keyNum; i++){
     uKeys[i] = APT_ConvertFromUTF8String(*keys[i]);
}

/* some code here */

delete[] uKeys;



Здесь APT_UString — это класс. А функция APT_ConvertFromUTF8String определена следующим образом:
Код

APT_DLL_CORE APT_UString APT_ConvertFromUTF8String(const APT_String& str, bool allowSur=true);

PM MAIL   Вверх
sQu1rr
Дата 30.11.2010, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Если APT_ConvertFromUTF8String создает новую строку в куче и возвращает указатель, то утечка имеет место.
В любом другом случае, можно спать спокойно
PM MAIL Skype GTalk   Вверх
alexr3
Дата 30.11.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.6.2008

Репутация: нет
Всего: нет



Цитата(sQu1rr @ 30.11.2010,  23:02)
Если APT_ConvertFromUTF8String создает новую строку в куче и возвращает указатель, то утечка имеет место.
В любом другом случае, можно спать спокойно

Так вот как раз не уверен, создает ли она новую строку. Все что у меня есть про эту функцию - это ее описание из .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-сервере. В данном приложении возможности отладки крайне скудны.
PM MAIL   Вверх
sQu1rr
Дата 30.11.2010, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



APT_UString - это класс?
Тогда можно спать спокойно  smile

Добавлено через 1 минуту
всмысле тогда код из первого поста верный )


Цитата(alexr3 @  30.11.2010,  23:15 Найти цитируемый пост)
Функция возвращает не сам указатель, а приведенный к классу: APT_UString

Ват?
PM MAIL Skype GTalk   Вверх
alexr3
Дата 30.11.2010, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.6.2008

Репутация: нет
Всего: нет



Цитата(sQu1rr @  30.11.2010,  23:32 Найти цитируемый пост)
Цитата(alexr3 @  30.11.2010,  23:15 Найти цитируемый пост)
Функция возвращает не сам указатель, а приведенный к классу: APT_UString

Ват? 



Э, я сам не совсем понимаю тонкостей: опыт работы с С++ небольшой. Но возвращатеся же не APT_UString*, а APT_UString. То есть где-то в теле функции, я подозреваю, есть что-то типа
Код

APT_UString *result = new APT_UString();
...
return *result;


А за ответ спасибо!

Это сообщение отредактировал(а) alexr3 - 30.11.2010, 23:46
PM MAIL   Вверх
sQu1rr
Дата 1.12.2010, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(alexr3 @ 30.11.2010,  23:45)
Цитата(sQu1rr @  30.11.2010,  23:32 Найти цитируемый пост)
Цитата(alexr3 @  30.11.2010,  23:15 Найти цитируемый пост)
Функция возвращает не сам указатель, а приведенный к классу: APT_UString

Ват? 



Э, я сам не совсем понимаю тонкостей: опыт работы с С++ небольшой. Но возвращатеся же не APT_UString*, а APT_UString. То есть где-то в теле функции, я подозреваю, есть что-то типа
Код

APT_UString *result = new APT_UString();
...
return *result;


А за ответ спасибо!

Перечитайте чтоли учебники по С++
Код

APT_UString *result = new APT_UString();
...
return *result;

Бессмыслено создавать new и передавать значение.
Если APT_UString класс - то 99% что деструктор сам позаботица об удалении того чего нужно:
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 1.12.2010, 05:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



alexr3

Конструкции вроде этой (а именно new, вызов функции, delete) всегда должны настораживать. Если при вызове функции произойдет исключение, delete никогда не будет вызван. Надо следить за безопасностью исключений. Решение - использовать умные указатели (boost::scoped_array) или поставить try-catch.
PM   Вверх
alexr3
Дата 1.12.2010, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.6.2008

Репутация: нет
Всего: нет



Цитата

Если APT_UString класс - то 99% что деструктор сам позаботица об удалении того чего нужно:

Я, может быть не совсем точно выразился. Я не боюсь за то, что APT_UString::~APT_UString() не освободит буфер. Это уже, в конце концов, его задача и его проблем. Повлиять на него я не могу. Меня вот что заботит:
Строкой 
Код

APT_UString *uKeys = new APT_UString[keyNum];

я же вроде создаю массив объектов APT_UString. Причем каждый элемент массива инициализируется вызовом APT_UString::APT_UString().
А потом строкой ниже 
Код

uKeys[i] = APT_ConvertFromUTF8String(*keys[i]);

я присваваю элементам массива новые объекты. И ссылки на старые у меня теряются. И при вызове оператора delete[] деструктов APT_UString::~APT_UString() будет вызван лишь для новых значений массива. А старый останутся "болтаться" в памяти.
Это так или я где-то ошибаюсь?

PM MAIL   Вверх
azesmcar
Дата 1.12.2010, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(alexr3 @  1.12.2010,  07:25 Найти цитируемый пост)
 И ссылки на старые у меня теряются.

Ты не ссылки присваиваешь а объект. Сперва создаешь keyNum объектов, потом им присваиваешь какой-то другой объект, вызовом оператора присваивания. 
PM   Вверх
alexr3
Дата 1.12.2010, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.6.2008

Репутация: нет
Всего: нет



А, точно-точно! Я что-то это совсем упустил из виду. Это все Java меня приучила думать, что присваивание лишь передает указатели.

Теперь понятно, почему delete[] отработает корректно. 

Спасибо всем!
 smile 

Это сообщение отредактировал(а) alexr3 - 1.12.2010, 08:21
PM MAIL   Вверх
Леопольд
Дата 1.12.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(alexr3 @  30.11.2010,  22:28 Найти цитируемый пост)
delete[] uKeys;
вызовет деструкторы для всех объектов в массиве.



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0963 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.