Уничтожение объектов
От: AlexandrRya  
Дата: 30.11.10 06:42
Оценка:
Как правильно освободить память в таком случае:


APT_UString *uKeys = new APT_UString[keyNum];

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


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

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


То есть я создаю массив объектов APT_UString, а потом присваиваю каждому элементу массива результат выполнения функции, который тоже является объектов APT_UString (не ссылка). Мне кажется, что здесь есть лишние объекты APT_UString, которые не уничтожаются. Как мне лучше сделать инициализацию и удаление объектов?
Re: Уничтожение объектов
От: sidorov18 США  
Дата: 30.11.10 07:37
Оценка:
Здравствуйте, AlexandrRya, Вы писали:

AR>Как правильно освободить память в таком случае:



AR>
AR>APT_UString *uKeys = new APT_UString[keyNum];

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


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


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


AR>То есть я создаю массив объектов APT_UString, а потом присваиваю каждому элементу массива результат выполнения функции, который тоже является объектов APT_UString (не ссылка). Мне кажется, что здесь есть лишние объекты APT_UString, которые не уничтожаются. Как мне лучше сделать инициализацию и удаление объектов?


вы про

delete[] uKeys;


?

еще для этого можно std::vector использовать — тогда он сам будет все удалять
Re[2]: Уничтожение объектов
От: AlexandrRya  
Дата: 30.11.10 07:42
Оценка:
Здравствуйте, sidorov18, Вы писали:

S>Здравствуйте, AlexandrRya, Вы писали:


AR>>Как правильно освободить память в таком случае:



AR>>
AR>>APT_UString *uKeys = new APT_UString[keyNum];

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


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


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


AR>>То есть я создаю массив объектов APT_UString, а потом присваиваю каждому элементу массива результат выполнения функции, который тоже является объектов APT_UString (не ссылка). Мне кажется, что здесь есть лишние объекты APT_UString, которые не уничтожаются. Как мне лучше сделать инициализацию и удаление объектов?


S>вы про


S>
S>delete[] uKeys;
S>


S>?


S>еще для этого можно std::vector использовать — тогда он сам будет все удалять


да-да. Я про delete[] uKeys. Вопрос в том, что в коде
APT_UString *uKeys = new APT_UString[keyNum];

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

есть утечки памяти или нет?
Про различные библиотеки типа Boost и даже std я знаю. Но использовать их не хочу: это компонент для другой программы, которая ставится на серверы под совершенно различные платформы. И не хочется потом бороться с тонкостями реализации std в разных системах, а уж тем более компилировать boost ради сишника размером в пару килобайт.
Re[3]: Уничтожение объектов
От: sidorov18 США  
Дата: 30.11.10 08:34
Оценка:
Здравствуйте, AlexandrRya, Вы писали:

AR>да-да. Я про delete[] uKeys. Вопрос в том, что в коде

AR>
AR>APT_UString *uKeys = new APT_UString[keyNum]; //выделяем память под массив, вызываем конструктор по умолчанию для каждого объекта

AR>for (int i=0; i < keyNum; i++){
AR>    uKeys[i] = APT_ConvertFromUTF8String(*keys[i]);//функция возвращает объект, вызывается конструктор копирования и временный объект удаляется.
AR>}
AR>delete[] uKeys;//вызываем деструкторы для каждого объекта + освобождаем память
AR>

AR>есть утечки памяти или нет?
AR>Про различные библиотеки типа Boost и даже std я знаю. Но использовать их не хочу: это компонент для другой программы, которая ставится на серверы под совершенно различные платформы. И не хочется потом бороться с тонкостями реализации std в разных системах, а уж тем более компилировать boost ради сишника размером в пару килобайт.

хм
А где может быть утечка?
вроде все нормально.
разве что что-то хитрое в реализации APT_UString

что касается boost — компилировать как отдельную либу ее, в большинстве случаев, не надо.
что касается std — там вроде crt только используется внутри — всякие strlen и т.п. эти зависимости решаются с помощью смены /MD флага на /MT. Только что попробовал с одним вектором собрать консольное приложение — размер увеличивается на 40кб
Re[4]: Уничтожение объектов
От: AlexandrRya  
Дата: 30.11.10 08:52
Оценка:
Здравствуйте, sidorov18, Вы писали:

S>Здравствуйте, AlexandrRya, Вы писали:


AR>>да-да. Я про delete[] uKeys. Вопрос в том, что в коде

AR>>
AR>>APT_UString *uKeys = new APT_UString[keyNum]; //выделяем память под массив, вызываем конструктор по умолчанию для каждого объекта

AR>>for (int i=0; i < keyNum; i++){
AR>>    uKeys[i] = APT_ConvertFromUTF8String(*keys[i]);//функция возвращает объект, вызывается конструктор копирования и временный объект удаляется.
AR>>}
AR>>delete[] uKeys;//вызываем деструкторы для каждого объекта + освобождаем память
AR>>

AR>>есть утечки памяти или нет?
AR>>Про различные библиотеки типа Boost и даже std я знаю. Но использовать их не хочу: это компонент для другой программы, которая ставится на серверы под совершенно различные платформы. И не хочется потом бороться с тонкостями реализации std в разных системах, а уж тем более компилировать boost ради сишника размером в пару килобайт.

S>хм

S>А где может быть утечка?
S>вроде все нормально.
S>разве что что-то хитрое в реализации APT_UString

S>что касается boost — компилировать как отдельную либу ее, в большинстве случаев, не надо.

S>что касается std — там вроде crt только используется внутри — всякие strlen и т.п. эти зависимости решаются с помощью смены /MD флага на /MT. Только что попробовал с одним вектором собрать консольное приложение — размер увеличивается на 40кб

А где может быть утечка?


Ок. Спасибо за ответ. По поводу флагов: /MD и /MT: собираться код будет под HP-UX его встроенным aCC, и под Redhat Linux его gcc.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.