crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

haiflive
  опции профиля:
сообщение 9.7.2011, 15:52
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 8.7.2010
Пользователь №: 1868

Спасибо сказали: 1 раз(а)




Репутация:   0  


Прошу разъяснить мне давно волнующую меня тему..
Вопрос про оператор new, в чём разница между этими двумя функциями?. какой вариант предпочтительней и почему?.

Функция 1:
void myFunction()
{
    myObject* obj = new myObject;
    /*...*/
    delete obj;
}


Функция 2:
void myFunction2()
{
    myObject obj;
    /*...*/
}


Я конечно понимаю, что выделение памяти произодёт в первом варианте в момент создания обекта, а во втором в момент обращения к функции.. А ни всё ли равно?. ну конечно если мы там внутри функции будем работать с "большим обектом", то его возможно потребуется удалить(и создать и удалить), НО рассматривается тот случай, когда создаётся объект в начале функции и удаляется только в конце..
Насчёт скорости ничего сказать не могу..
Насчёт ошибок, второй вариант предпочтительней так как по объёму написанного кода меньше, и не надо думать о том, что бы удалять обект.
Почему я сплошь и рядом наблюдаю первый вариант?. это что такая привычка, или есть скрытый смысл?.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
haiflive
  опции профиля:
сообщение 10.7.2011, 6:57
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 8.7.2010
Пользователь №: 1868

Спасибо сказали: 1 раз(а)




Репутация:   0  


Спасибо всем за исчерпывающие ответы.

Цитата
стек - "удобный, не резиновый"

Насколько он не резиновый?. или это зависит от компилятора?. Компилятор MinGW напритмер?

Цитата(Алексей1153 @ 10.7.2011, 0:52) *
>>Почему я сплошь и рядом наблюдаю первый вариант?
покажи пример

Наверное я слишком часто читал книги по QT, вот там просто пистрит подобными примерами..

#include <QtGUI>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    QSplitter   spl(Qt::Vertical);
    QTextEdit*  ptxt1 = new QTextEdit;
    QTextEdit*  ptxt2 = new QTextEdit;
    spl.addWidget(ptxt1);
    spl.addWidget(ptxt2);
    
    ptxt1->setPlainText("Line1\n"
                        "Line2\n"
                        "Line3\n"
                        "Line4\n"
                        "Line5\n"
                        "Line6\n"
                        "Line7\n"
                        );
    ptxt2->setPlainText(ptxt1->toPlainText());
    spl.resize(200,200);
    spl.show();
    
    return a.exec();
}


Цитата
нет, т.к. во-втором случае, как только выйдешь из функции - объект умрёт, а в-первом случае - останется жить. И, если ты сохранишь указатель на объект в-первом случае, то сможешь к этому объекту обращаться в будущем.

Это я понимаю, но рассматривается случай(как любаят писать при доказателствах теорем: "в том и только в том случае"), когда обект создан в начале и удалён в конце функции. Хотя является плохим тоном переносить обязанность удаления обекта на клиента, стараюсь избегать этого..

Цитата
сейчас напрямую выделение динамических объектов в памяти используется не так часто.
когда объектов много - то проще юзать различные "умные" указатели, за которыми не нужно следить, или пулы переменных, в которых "выделение" и "освобождение" памяти происходит куда быстрее, чем множественными вызовами для каждого элемента.

Знаю про "умные указатели", но не использую их так как пока пишу только для десктопа.. просто голова кругом идёт когда начинаешь использовать эти умные казатели, а вот про пулы переменных почитаю.. что-то не слышал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 28.6.2025, 1:22