Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели, строки, классы и пр. Си++ новичкам посвящается... 
V
    Опции темы
maxim1000
Дата 2.12.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



в общем смысле динамическое использование памяти нужно для контроля времени жизни объекта
при использовании стека если объект1 создан раньше объекта2, то уничтожен он будет позже
именно из этого ограничения исходит скорость работы - функции выделения освобождения памяти зачастую сводятся к одной команде процессора, а проблемы поиска и фрагментации не возникают в принципе
(ну ещё на скорость влияет то, что чаще всего стек находится в кеше, а значит не нужно его ниоткуда доставать, но это уже зависит от платформы)

если вернуться к C++, то ещё одно достоинство (которое уже упоминали) - автоматическое удаление выделенного объекта при выходе из блока, так что забыть это сделать невозможно

лично я стараюсь по минимуму использовать динамическую память и другое выделение ресурсов, которые потом нужно явно освобождать, только когда без этого сложно обойтись (как уже привели пример с неизвестным количеством элементов) или это сильно повышает эффективность (когда она критична), но даже в этих случаях (особенно когда программа сложная) не помешает упаковать управление этими ресурсами в какой-нибудь класс, который будет следить за ними (для всяких массивов чаще всего подходит std::vector)...


--------------------
qqq
PM WWW   Вверх
UnrealMan
Дата 2.12.2006, 20:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(drLans @  2.12.2006,  15:56 Найти цитируемый пост)
Люди поясните, плз, в чем отличие динамического выделения памяти от обычного задания того же массива в тексте программы? 

А под статически объявленный массив память тоже может выделяться динамически (если он объявлен как член класса и память под объект такого класса выделяется динамически).

По поводу отличий ничего говорить не буду, ибо вопрос – суть боян. В И-нете полно литературы – читай и просвещайся. Всё равно по-нормальному научиться чему-то без книг, задавая подобные вопросы на форумах, вряд ли получится.

Б. Страуструп: «Язык программирования С++ (2-е дополненное издание)» 3.2.6 Свободная память.

Цитата(maxim1000 @  2.12.2006,  19:46 Найти цитируемый пост)
при использовании стека если объект1 создан раньше объекта2, то уничтожен он будет позже

Необязательно. Из-за оптимизации это правило может быть нарушено, например:

Код
struct A
{
    A() { static int i; cout << "A()  a" << (n = ++i) << endl; }
    ~A() { cout << "~A() a" << n << endl; }
    int n;
};

A func()
{
    A a1;
    A a2;
    return a2;
}

int main()
{
    A a = func();
}

вывод (MinGW-3.4.4):

Код
A()  a1
A()  a2
~A() a1
~A() a2

– т.е. объект a2 функции func может быть создан прямо на месте объекта a в функции main и уничтожен только по завершении main.
PM MAIL   Вверх
ali01
Дата 24.8.2007, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 29.7.2007

Репутация: нет
Всего: нет



А где же про классы? есть вопрос если в классе создаются динамические переменные, в деструкторе надо вызывать delete?
PM MAIL   Вверх
bsa
Дата 24.8.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(ali01 @ 24.8.2007,  04:52)
А где же про классы? есть вопрос если в классе создаются динамические переменные, в деструкторе надо вызывать delete?

Если где-то сделан new, то обязательно должен быть выполнен соответствующий delete. Иначе никак. И не важно где, в классах, структурах или функциях.
PM   Вверх
ali01
Дата 24.8.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 29.7.2007

Репутация: нет
Всего: нет



Деструктор сам этого не делает? А когда автоматически создаешь класс например в VC там создается пустой конструктор, я так понял надо самому там прописывать delete?
PM MAIL   Вверх
Daevaorn
Дата 24.8.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Цитата(ali01 @  24.8.2007,  22:24 Найти цитируемый пост)
Деструктор сам этого не делает? 

нет. delete он не вызывает для динамических объектов.
Цитата(ali01 @  24.8.2007,  22:24 Найти цитируемый пост)
А когда автоматически создаешь класс например в VC там создается пустой конструктор, я так понял надо самому там прописывать delete? 

по логике скорей всего не в конструктор, а в деструктор.
PM MAIL WWW   Вверх
ali01
Дата 24.8.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 29.7.2007

Репутация: нет
Всего: нет



Да, запутался. Я понял, спасибо. Раньше думал деструктор сам все сделаетsmile
PM MAIL   Вверх
ali01
Дата 2.9.2007, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 29.7.2007

Репутация: нет
Всего: нет



Цитата(bsa @ 24.8.2007,  09:35)
Цитата(ali01 @ 24.8.2007,  04:52)
А где же про классы? есть вопрос если в классе создаются динамические переменные, в деструкторе надо вызывать delete?

Если где-то сделан new, то обязательно должен быть выполнен соответствующий delete. Иначе никак. И не важно где, в классах, структурах или функциях.

Просматривал код wxFormBuilder, пример конструктора: 
Код

MainFrame::MainFrame(wxWindow *parent, int id)
: wxFrame(parent,id,wxT("wxFormBuilder v.0.1"),wxDefaultPosition,wxSize(1000,800))
{

        wxIcon ico;
        ico.CopyFromBitmap( AppBitmaps::GetBitmap(wxT("app")));
        SetIcon( ico );

        wxString date(wxT(__DATE__));
        wxString time(wxT(__TIME__));
        SetTitle(wxT("wxFormBuilder (Build on ") + date +wxT(" - ")+ time + wxT(")"));

        SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));

        wxMenu *menuFile = new wxMenu;
        menuFile->Append(ID_NEW_PRJ, wxT("&New"), wxT("create an empty project"));
  
[skip]

        wxMenu *menuEdit = new wxMenu;
        menuEdit->Append(ID_UNDO, wxT("&Undo \tCtrl+Z"), wxT("Undo changes"));

[skip]

        wxMenu *menuHelp = new wxMenu;
        menuHelp->Append(ID_ABOUT, wxT("&About...\tF1"), wxT("Show about dialog"));


        // now append the freshly created menu to the menu bar...
        wxMenuBar *menuBar = new wxMenuBar();
        menuBar->Append(menuFile, wxT("&File"));
        menuBar->Append(menuEdit, wxT("&Edit"));
        menuBar->Append(menuHelp, wxT("&Help"));

        // ... and attach this menu bar to the frame
        SetMenuBar(menuBar);
        wxBoxSizer *top_sizer = new wxBoxSizer(wxVERTICAL);

        ///////////////

        wxSplitterWindow *v_splitter = new wxSplitterWindow(this,-1,wxDefaultPosition,wxDefaultSize, wxSP_3DSASH | wxSP_LIVE_UPDATE);
        wxPanel *left = new wxPanel(v_splitter,-1);//,wxDefaultPosition, wxDefaultSize,wxSIMPLE_BORDER);
        wxBoxSizer *left_sizer = new wxBoxSizer(wxVERTICAL);

        wxPanel *right = new wxPanel(v_splitter,-1);
        v_splitter->SplitVertically(left,right,300);

        wxSplitterWindow *h_splitter = new wxSplitterWindow(left,-1,wxDefaultPosition,wxDefaultSize, wxSP_3D | wxSP_LIVE_UPDATE);//wxSP_BORDER);

        wxPanel *tree_panel = new wxPanel(h_splitter,-1);
        Title *tree_title = new Title(tree_panel,wxT("Object Tree"));

[skip]

        toolbar->Realize();

        SetSizer(top_sizer);
//      top_sizer->SetSizeHints(this);
        SetAutoLayout(true);
        Layout();
        Fit();

        //SetSize(wxSize(1000,800));
        RestorePosition(wxT("mainframe"));
        //Centre();
        Refresh();

        // añadimos el manejador de las teclas rápidas de la aplicación
        // realmente este es el sitio donde hacerlo ?????
        //m_objTree->AddCustomKeysHandler(new CustomKeysEvtHandler(data));
        AppData()->AddHandler( this->GetEventHandler() );
};



и деструктора:
Код


MainFrame::~MainFrame()
{/*
 #ifdef __WXFB_DEBUG__
 wxLog::SetActiveTarget(m_old_log);
 m_log->GetFrame()->Destroy();
 #endif //__WXFB_DEBUG__
 */

        // Eliminamos los observadores, ya que si quedara algún evento por procesar
        // se produciría un error de acceso no válido debido a que los observadores
        // ya estarían destruidos

        AppData()->RemoveHandler( this->GetEventHandler() );
}


Там вообще нет delete. Или может я что-то не понял? 
PM MAIL   Вверх
archimed7592
Дата 2.9.2007, 03:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



ali01, посмотри деструкторы базовых классов. Там(чуть ли не на самом верху иерархии) должны быть примерно следующие строки:
Код
for (SomeContainer::iterator i = children.begin(), end = children.end(); i != end; ++i)
    delete *i;

Во всяком случае в известных мне тулкитах(Qt, VCL) все компоненты хранятся и удаляются единообразно(т.о. позволяя не заботиться о MM... хорошо это или плохо - вопрос другой темы).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
archimed7592
Дата 28.12.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93




M
archimed7592
Оффтопик и личная переписка удалены.
Одна конструктивная беседа выделена в тему расширение динамического массива.

Спасибо zkv за то, что подчистил тему :).


Это сообщение отредактировал(а) archimed7592 - 8.1.2008, 16:02


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
anatox91
Дата 27.1.2008, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: 1
Всего: 13



ManiaK, большое спасибо за интересную статью и своеобразный стиль изложения  smile 

Тема разделена: Возвращение указателя на локальный объект, warning C4172: returning address of local variable or temporary.

Это сообщение отредактировал(а) archimed7592 - 3.2.2008, 00:52


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Annuta
Дата 27.8.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



У меня такой вопрос - есть ли разница между этими двумя объявлениями. Какое из них более рационально  ?
TMinuit *min = new TMinuit(6);    
TMinuit min(6);
--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
bsa
Дата 27.8.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Annuta @ 27.8.2008,  15:04)
У меня такой вопрос - есть ли разница между этими двумя объявлениями. Какое из них более рационально  ?
TMinuit *min = new TMinuit(6);    
TMinuit min(6);

Второе.
Если есть желание обсудить этот вопрос, то лучше создать отдельную тему
PM   Вверх
XeS
Дата 30.8.2008, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.4.2008

Репутация: нет
Всего: нет



Маленький вопросик по работе с указателями

Код

int* p[10];


это как я понимаю массив из 10 указателей, т.е я с ним работаю так

Код

p[0] = new int;
p[1] = new int;
delete p[0];
delete p[1];


а конструкция такого вида

Код

int (*p)[10]


это указатель на массив из 10 int

я с ним работаю так

Код

p = new int;
p[0] = 1;
p[1] = 2;
delete p;


я прав????
PM MAIL   Вверх
J0ker
Дата 14.10.2008, 03:11 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(XeS @  30.8.2008,  01:12 Найти цитируемый пост)
я прав???? 

нет
можно так:
Код

int (*p)[10];
p = reinterpret_cast<int(*)[10]>(new int[10]);
p[0] = 1;
p[1] = 2;
delete[] p;


технически int* и int(*)[n] - разные типы, и данная запись несколько бессмысленна... ну разве что вам надо передавать p в функцию принимающую конкретно int(*)[n]
но той-же функциональностью обладает следующий код:
Код

int *p = new int[10];
p[0] = 1;
p[1] = 2;
delete[] p;



--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1355 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.