Russian Qt Forum

Qt => Общие вопросы => Тема начата: loewa от Январь 26, 2006, 13:55



Название: Как правельно удалить QString
Отправлено: loewa от Январь 26, 2006, 13:55
Точнее память выделеную под строку
что только не делаю выделять выделяет а отдавать не хочет
str="";
delete str;
/-------------/
str=""
str.squeeze();

непонимаю я :(

linux, Qt 3


Название: Как правельно удалить QString
Отправлено: Steven_Orko от Январь 26, 2006, 14:06
Цитировать
str="";
delete str;

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

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

Тогда яснее было бы.
А зачем тебе это? Тебе жалко пару байтиков? ))) :D


Название: Как правельно удалить QString
Отправлено: zlatko от Январь 26, 2006, 14:10
QString сам заботится об виделении(читай освобождении) памяти, а вобше согласен с Steven_Orko, вопрос поставлен некоректно и непонятно.


Название: Как правельно удалить QString
Отправлено: loewa от Январь 26, 2006, 14:25
Код:

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


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

Я вызываю кллас (в нём эта переменная ) каждую минуту в первй раз он выделяет память и не очищает а последующие разы невыделяет видимо пользует ранее выделеную


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


Название: Как правельно удалить QString
Отправлено: BaltikS от Январь 26, 2006, 15:05
Да и строку следует обнулять не так...
Код:
str = QString::null;


Название: Как правельно удалить QString
Отправлено: Rainbow от Январь 26, 2006, 15:43
Как у автора тоже годится.


Название: Как правельно удалить QString
Отправлено: Steven_Orko от Январь 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


Название: Как правельно удалить QString
Отправлено: BaltikS от Январь 26, 2006, 16:03
Абсолютно верно!!!
NULL != ""


Название: Как правельно удалить QString
Отправлено: nEoN от Январь 26, 2006, 17:11
Цитата: "BaltikS"
Да и строку следует обнулять не так...
Код:
str = QString::null;

А лучше так :
Код:
str.clear();


Название: Как правельно удалить QString
Отправлено: BaltikS от Январь 26, 2006, 17:32
nEoN, а почему так лучше? По-моему то же самое...


Название: Как правельно удалить QString
Отправлено: Steven_Orko от Январь 26, 2006, 17:38
Цитата: "BaltikS"
nEoN
, а почему так лучше? По-моему то же самое...

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


Название: Как правельно удалить QString
Отправлено: Dendy от Январь 26, 2006, 19:34
Дружно читаем статью Троллей, посвящённую портированию Qt3 -> Qt4.

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

Код:
string.clear();


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

Код:
string = QString();


Больше никаких QString::null, он оставлен просто для совместимости.


Название: Как правельно удалить QString
Отправлено: nEoN от Январь 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)


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

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