Russian Qt Forum

Программирование => С/C++ => Тема начата: Sancho_s_rancho от Август 03, 2010, 09:22



Название: [Решено]Умный указатель на член класса
Отправлено: Sancho_s_rancho от Август 03, 2010, 09:22
В  статье http://www.codeproject.com/KB/stl/boostsmartptr.aspx (http://www.codeproject.com/KB/stl/boostsmartptr.aspx) рекомендуется использовать Scoped Pointer  для автоматического уничтожения членов класса. Как же это можно сделать, если у него даже оператора "=" нет?
В заголовочном файле можем написать QScopedPointer<MyClass> p, и что делать далее?


Название: Re: Умный указатель на член класса
Отправлено: BRE от Август 03, 2010, 09:56
Инициализировать в конструкторе, также есть метод:
void QScopedPointer::swap ( QScopedPointer<T, Cleanup> & other )


Название: Re: Умный указатель на член класса
Отправлено: Sancho_s_rancho от Август 03, 2010, 10:30
Инициализировать в конструкторе, также есть метод:
void QScopedPointer::swap ( QScopedPointer<T, Cleanup> & other )
QScopedPointer::swap я и не разглядел. Спасибо


Название: Re: Умный указатель на член класса
Отправлено: SABROG от Август 03, 2010, 10:50
Обычно используется метод reset().


Название: Re: Умный указатель на член класса
Отправлено: Sancho_s_rancho от Август 03, 2010, 10:55
Обычно используется метод reset().
Черт, мне уже стыдно. Не люблю тех, кто не читает документацию и спрашивает всякую фигню, а сам поступил так же.


Название: Re: Умный указатель на член класса
Отправлено: blood_shadow от Август 11, 2010, 19:28
Инициализировать в конструкторе, также есть метод:
void QScopedPointer::swap ( QScopedPointer<T, Cleanup> & other )
Вопрос про умный указатель -
 есть метод
Код:
void val::runString_value() const
{
    QString program = "C:\\Program_Files\\Qt\\2010.02\\files\\Gui\\string_val\\val1\\String_value(betta).exe";

    QProcess *process = new QProcess;
    process->start(program);
    connect(process, SIGNAL(finished(int, QProcess::ExitStatus)),
            this, SLOT(loadOutputText()));

    //delete process; - Нельзя!!
    return;
}
удалить process нельзя так как получится удаление до завершения процесса, вопрос - если применять этот "умный указатель" он освободит память после завершение process, если даже произойдет выход по ретурну? Он в любом случае удалит указатель на объект если тот уже ненужен будет?
Спасибо


Название: Re: [Решено]Умный указатель на член класса
Отправлено: Авварон от Август 11, 2010, 19:31
connect(process, SIGNAL(finished(int, QProcess::ExitStatus)),
            process, SLOT(deleteLater()));


Название: Re: [Решено]Умный указатель на член класса
Отправлено: blood_shadow от Август 11, 2010, 19:43
connect(process, SIGNAL(finished(int, QProcess::ExitStatus)),
            process, SLOT(deleteLater()));
Спасибо, получилось :), то есть кругом можно обойтись и без этого "умного указателя"? или все же есть ситуации где без него никак?


Название: Re: [Решено]Умный указатель на член класса
Отправлено: Авварон от Август 11, 2010, 19:51
а хрен знает, никогда не использовал)
по идее только для удобства/уменьшения ошибок


Название: Re: [Решено]Умный указатель на член класса
Отправлено: blood_shadow от Август 11, 2010, 20:00
а хрен знает, никогда не использовал)
по идее только для удобства/уменьшения ошибок
Благо в Qt усть механизм сигнал-слот, мне спадает на мысль что это в других фреймворках уместно  :)


Название: Re: [Решено]Умный указатель на член класса
Отправлено: Авварон от Август 11, 2010, 20:04
не, ну через делет лейтер объект будет удален только когда управление попадет только на следующий виток цикла событий...
иногда это нежелательно