Russian Qt Forum
Ноябрь 23, 2024, 20:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правельно удалить QString  (Прочитано 13678 раз)
loewa
Гость
« : Январь 26, 2006, 13:55 »

Точнее память выделеную под строку
что только не делаю выделять выделяет а отдавать не хочет
str="";
delete str;
/-------------/
str=""
str.squeeze();

непонимаю я Грустный

linux, Qt 3
Записан
Steven_Orko
Гость
« Ответ #1 : Январь 26, 2006, 14:06 »

Цитировать
str="";
delete str;

Непонятно... Вот если бы ты
Код:

QString *str = new QString();
delete str;

Тогда яснее было бы.
А зачем тебе это? Тебе жалко пару байтиков? ))) Веселый
Записан
zlatko
Гость
« Ответ #2 : Январь 26, 2006, 14:10 »

QString сам заботится об виделении(читай освобождении) памяти, а вобше согласен с Steven_Orko, вопрос поставлен некоректно и непонятно.
Записан
loewa
Гость
« Ответ #3 : Январь 26, 2006, 14:25 »

Код:

QString *str = new QString();
delete str;


и так делаю. и у меня не пару байтиков а 200кb и жалко мне их.

Я вызываю кллас (в нём эта переменная ) каждую минуту в первй раз он выделяет память и не очищает а последующие разы невыделяет видимо пользует ранее выделеную
Записан
Steven_Orko
Гость
« Ответ #4 : Январь 26, 2006, 14:47 »

Ну во-первых, класс QString, как было написано zlatko, сам заботится о том, сколько и когда памяти выделить под хранение данных и сколько освободить. Сам класс реализован по схеме "конверт-письмо" и в нем реализован специальный механизм по подсчету ссылок (Впрочем, так можно сказать о многих Qt-классах). Метод реализации направлен на оптимальную работу с памятью в любом месте, где используется экземпляр данного класса(имеется ввиду скорость, объем, размещение и т.д.). Подробнее об этом ты можешь почитать в книге Дж. Коплиена "Программирование на С++" серии "CS". Если у тебя расшарено около 200Кб, значит столько нужно для оптимального размещения твоих данных и последующей работы с ними. Как ты определяешь, сколько места в памяти занимает данный объект?
По поводу QString, кажется, все. Этот вопрос может быть актуален для классов STL или аналогичных им Qt-классов. Для решения тобою затронутой проблеммы необходимо использовать swap(), который меняет содержимое, как можно догадаться. Создаешь новый, допустим, вектор и меняешь его содержимое со старым разросшимся в памяти вектором.
Записан
BaltikS
Гость
« Ответ #5 : Январь 26, 2006, 15:05 »

Да и строку следует обнулять не так...
Код:
str = QString::null;
Записан
Rainbow
Гость
« Ответ #6 : Январь 26, 2006, 15:43 »

Как у автора тоже годится.
Записан
Steven_Orko
Гость
« Ответ #7 : Январь 26, 2006, 15:57 »

Цитата: "Rainbow"
Как у автора тоже годится.

 :wink:
Код:
        QString().isNull();             // returns true
        QString().isEmpty();            // returns true

        QString("").isNull();           // returns false
        QString("").isEmpty();          // returns true

        QString("abc").isNull();        // returns false
        QString("abc").isEmpty();       // returns false
Записан
BaltikS
Гость
« Ответ #8 : Январь 26, 2006, 16:03 »

Абсолютно верно!!!
NULL != ""
Записан
nEoN
Гость
« Ответ #9 : Январь 26, 2006, 17:11 »

Цитата: "BaltikS"
Да и строку следует обнулять не так...
Код:
str = QString::null;

А лучше так :
Код:
str.clear();
Записан
BaltikS
Гость
« Ответ #10 : Январь 26, 2006, 17:32 »

nEoN, а почему так лучше? По-моему то же самое...
Записан
Steven_Orko
Гость
« Ответ #11 : Январь 26, 2006, 17:38 »

Цитата: "BaltikS"
nEoN
, а почему так лучше? По-моему то же самое...

Действительно, почему так лучше?
Записан
Dendy
Гость
« Ответ #12 : Январь 26, 2006, 19:34 »

Дружно читаем статью Троллей, посвящённую портированию Qt3 -> Qt4.

Сделать строку пустой:

Код:
string.clear();


Сделать строку нулевой:

Код:
string = QString();


Больше никаких QString::null, он оставлен просто для совместимости.
Записан
nEoN
Гость
« Ответ #13 : Январь 26, 2006, 19:52 »

Цитата: "Steven_Orko"
Цитата: "BaltikS"
nEoN
, а почему так лучше? По-моему то же самое...

Действительно, почему так лучше?

Потомучто clear() это стандартная фукция и предназначена именно для очистки строки.

Вот её внутренности в Qt 4.1
Код:
// Qt\4.1.0\src\corelib\tools\qstring.h
inline void QString::clear()
{ if (!isNull()) *this = QString(); }


добавлено спустя 2 минуты:

 Причём после clear() строка становится и пустой (isEmpty) и нулевой (isNull)
Записан
Dendy
Гость
« Ответ #14 : Январь 27, 2006, 10:33 »

Даааа... действительно, тупанул я Веселый  Тролли предлагают не различать пустую и нулевую строку и пользоваться всегда QString::isEmpty(). ИМХО, несогласен, нулевая строка и пустая - разньІе вещи. Нулевой обьект - вообще универсальньІй механизм для получения данньІх. Например:

Код:
QString str = findSomeString();
if ( str.isNull() ) // строка не найдена
{
  ...
}
else // строка найдена, размер ей может бьІть 0, но главное - само её наличие
{
  ...
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.232 секунд. Запросов: 21.