Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139

Дин. выделение памяти, конструкторы/деструкторы

12.11.2011, 00:54. Показов 3521. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хотел бы уточнить.
1)
Чем отличается это:
C++
1
2
3
4
5
int main()
{
    int value = 0;
    return 0;
}
от этого
C++
1
2
3
4
5
6
int main()
{
    int *ptr = new int(0);
    delete ptr;
    return 0;
}
?
Про то, что первое будет находится в стэке, а второе в куче я знаю.
А какие другие различия?
Да и что выигрывает? Стэк или куча? Думаю, что стэк, но уточнить стоит.

2) При вызове деструктора уничтожаются все не статические объекты класса? Я говорю про int value, char name[ 50 ], std::string и т.д. Про то, что динамически выделенную память надо освобождать самому я знаю.
Даже если деструктор вызвать в ручную?
3) При вызове конструктора создаются все не статические объекты класса? Даже если вызвать конструктор в ручную?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2011, 00:54
Ответы с готовыми решениями:

Выделение дин. памяти
Динамически (в темпе :3) выделяю динамическую память для двухмерного массива вот так вот: int **mat = new int*; for (int i = 0; i...

Конструкторы и деструкторы
Помогите, пожалуйста, исправить программу и закончить ее как надо. Необходимо реализовать класс с двумя полями, имеющими имена first и...

Конструкторы и деструкторы
Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны присутствовать: Для инициализации...

28
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.11.2011, 01:12
Цитата Сообщение от Chelioss Посмотреть сообщение
Да и что выигрывает? Стэк или куча? Думаю, что стэк, но уточнить стоит.
в стеке шустрее создается, при использовании кучи сначала происходит поиск свободного места что отнимает время

Цитата Сообщение от Chelioss Посмотреть сообщение
2) При вызове деструктора уничтожаются все не статические объекты класса? Я говорю про int value, char name[ 50 ], std::string и т.д.
как правило указатель стека смещается и они попросту недоступны

Цитата Сообщение от Chelioss Посмотреть сообщение
3) При вызове конструктора создаются все не статические объекты класса? Даже если вызвать конструктор в ручную?
создаются, но переменные скалярного типа
Цитата Сообщение от Chelioss Посмотреть сообщение
int value, char name[ 50 ]
инициализируется мусором если их не инициализировать в конструкторе
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
12.11.2011, 01:15  [ТС]
Почему можно вызвать сколько угодно раз подряд деструктор/конструктор?
0
 Аватар для DenCHS200
32 / 32 / 8
Регистрация: 07.10.2011
Сообщений: 117
12.11.2011, 01:23
Постараюсь ответить на 1й вопрос:
2й вариант кода, это создаётся указатель на переменную int.Если не ошибаюсь, то стек работает быстрее кучи. 2й вариант, это уже динамическое выделение памяти , её в основном , используют при создании динамических массивов (Их размерность может меняться ),или для извлечения адреса(отладка, дизассемблирование и так далее), или при передаче параметров функции(например, указатель на массив) .По идее, 1й код должен быстрее работать, так как разница в скорости возникает в то время, когда нужно занять/освободить место в памяти. Стек всегда готов к размещению новых данных и всегда готов у удалению данных. А кучей по сути является свободное пространство в памяти и для того чтоб разместить в ней данные, нужно обратиться к менеджеру памяти, менеджер памяти найдет свободное место нужного размера в памяти, зарегистрирует его как занятый и вернет адрес этого блока в программу. При удалении блока данных из кучи так же нужно обратиться к менеджеру памяти, менеджер памяти пометит данный кусок памяти как свободный. А так указателями редко пользуюсь при написании простых программ.Хотя может ещё какое применение у них
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
12.11.2011, 01:41  [ТС]
Цитата Сообщение от DenCHS200 Посмотреть сообщение
2й вариант, это уже динамическое выделение памяти , её в основном , используют при создании динамических массивов
Да причем тут это? Я про механизм, а не как этим пользуются, спрашиваю.
Цитата Сообщение от DenCHS200 Посмотреть сообщение
или при передаче параметров функции(например, указатель на массив)
Указателю на массив пофиг на что он указывает. На дин. выделенную память или нет. И то и то работает, и то и то используют.
Цитата Сообщение от DenCHS200 Посмотреть сообщение
когда нужно занять/освободить место в памяти.
А для не дин. объектов уже занимать память не надо?

Цитата Сообщение от DenCHS200 Посмотреть сообщение
А кучей по сути является свободное пространство в памяти и для того чтоб разместить в ней данные, нужно обратиться к менеджеру памяти, менеджер памяти найдет свободное место нужного размера в памяти, зарегистрирует его как занятый и вернет адрес этого блока в программу. При удалении блока данных из кучи так же нужно обратиться к менеджеру памяти, менеджер памяти пометит данный кусок памяти как свободный.
У стэка нет никаких "менеджеров памяти"?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.11.2011, 01:54
Цитата Сообщение от Chelioss Посмотреть сообщение
У стэка нет никаких "менеджеров памяти"?
у стека лишь указатель на верхушку + еще пару вспомогательных указателей(насчет последних не уверен)

Добавлено через 4 минуты
а вообще воть почитай

Добавлено через 47 секунд
и воть
2
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
12.11.2011, 02:58
Цитата Сообщение от Chelioss Посмотреть сообщение
Да и что выигрывает? Стэк или куча? Думаю, что стэк, но уточнить стоит.
в при произвольном доступе - куча, при последовательном - стек. Не зряже существует и то и другое.
Цитата Сообщение от Chelioss Посмотреть сообщение
А какие другие различия?
разница будет в адресации данных процессором. Это единственное и главное отличие, а из него уже вытекают все остальные отличия. Интересный вопрос, засяду за чтение документации gcc.
1
Заблокирован
12.11.2011, 03:02
Цитата Сообщение от alkagolik Посмотреть сообщение
в при произвольном доступе - куча, при последовательном - стек. Не зряже существует и то и другое.
Не понятна формулировка.

Что значит последовательный/произвольный доступ к памяти?

Я на стеке сделал парочку переменных, и обращаюсь к любой из них в любой момент. Это что, дольше, чем если бы они жили в куче?
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
12.11.2011, 03:04
Цитата Сообщение от alkagolik Посмотреть сообщение
в при произвольном доступе - куча, при последовательном - стек. Не зряже существует и то и другое.
выделения стековой памяти самое быстрое
это очевидно из архитектуры
там мендежера нет - там управлять то почти нечем
1
Заблокирован
12.11.2011, 21:35
Цитата Сообщение от Chelioss Посмотреть сообщение
Хотел бы уточнить.
1)
Чем отличается это:
C++
1
2
3
4
5
int main()
{
    int value = 0;
    return 0;
}
от этого
C++
1
2
3
4
5
6
int main()
{
    int *ptr = new int(0);
    delete ptr;
    return 0;
}
?
Про то, что первое будет находится в стэке, а второе в куче я знаю.
А какие другие различия?
Да и что выигрывает? Стэк или куча? Думаю, что стэк, но уточнить стоит.

2) При вызове деструктора уничтожаются все не статические объекты класса? Я говорю про int value, char name[ 50 ], std::string и т.д. Про то, что динамически выделенную память надо освобождать самому я знаю.
Даже если деструктор вызвать в ручную?
3) При вызове конструктора создаются все не статические объекты класса? Даже если вызвать конструктор в ручную?
По первому вопросу отличие очевидно. delete делает две вещи: вызывает деструктор, а затем вызывает оператор-функцию delete. Причем эта функция для пользовательских типов может быть перегружена.
В вашем примере. когда целочисленная переменная определяется в стеке, то компилятор не вызывает оператор-функцию delete. Ей просто делать нечего. Компилятор просто выравнивает стек до вызова в функцию main. То есть во втором случае с кучей мы получаем дополнительные издержки по вызову оператор-функции.
Кроме того даже при инициализации объекта в кучи функции new нужно передать аргумент, который в вашем случае равен нулю. Это еще дополнительные издержки, то есть издержки по передачи аргументов в функцию. Когда же переменная создается в стеке, то компилятор просто "вшивает" инструкцию инициализации в код.

Отвечая на второй вопрос, замечу, что деструкторы имеются только у пользовательских типов. К фундаментальным типам деструкторы никакого отношения не имеют. Если вы имеет класс, в которым определены поля в виде фундаментальных типов, то из памяти удаляется один непрерывный участок, который был выделен для объекта.

Что касается третьего вопроса, то конструктор вызывает сначала конструкторы базовых классов, если такие имеются, а затем конструкторы членов класса, если они также имеют свои конструкторы. Вызываются конструкторы в порядке их определения за исключением виртуальных базовых классов.
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
12.11.2011, 21:56  [ТС]
А как насчет вызова конструкторов\деструкторов несколько раз подряд? Почему это работает?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.11.2011, 22:00
Цитата Сообщение от Chelioss Посмотреть сообщение
А как насчет вызова конструкторов\деструкторов несколько раз подряд? Почему это работает?
детализируй вопрос пожалуйста
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
12.11.2011, 22:49  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
детализируй вопрос пожалуйста
Написал пример и даже появился вопрос. Почему можно вызвать дестркутор до конструктора?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Foo
{
public: 
    Foo() : a( 5 ) {}
    ~Foo() { ++a; }
private:
    int a;
};
int main()
{
    Foo f;
    f.Foo::Foo();
    f.Foo::Foo();
    f.Foo::Foo();
    f.Foo::Foo();
 
    f.Foo::~Foo();
    f.Foo::~Foo();
    f.Foo::~Foo();
    f.Foo::~Foo();
 
    f.Foo::Foo();
    f.Foo::Foo();
    f.Foo::Foo();
    f.Foo::Foo();
 
    f.Foo::~Foo();
    f.Foo::~Foo();
    f.Foo::~Foo();
    f.Foo::~Foo();
 
    return 0;
}
0
Заблокирован
12.11.2011, 22:52
Цитата Сообщение от Chelioss Посмотреть сообщение
Написал пример и даже появился вопрос. Почему можно вызвать дестркутор до конструктора?
Конструкторы и диструкторы - самые обыкновенные методы с немножечко другим синтаксисом и немножечко дополнительными особенностями.
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
12.11.2011, 22:55  [ТС]
Цитата Сообщение от Bers Посмотреть сообщение
Конструкторы и диструкторы - самые обыкновенные методы с немножечко другим синтаксисом и немножечко дополнительными особенностями.
Разве при вызове конструктора/деструктора не вызываются конструкторы\деструкторы для встроенных типов?
Если так, то почему можно много раз занимать память для встроенного типа и много раз освобождать память?
0
Заблокирован
12.11.2011, 23:08
Цитата Сообщение от Chelioss Посмотреть сообщение
Разве при вызове конструктора/деструктора не вызываются конструкторы\деструкторы для встроенных типов?
Диструктор автоматически запускается при разрушении объекта (если верить книгам, это единственная причина, почему он вообще существует)

Вот что у тебя написано в теле самого метода - то и выполнится при разрушении объекта.
Если там написано, что надо память освободить - то она освободится. Если не написано - не освободится.

объекты созданные на стеке разрушаются не потому, что у их хозяина сработал диструктор, а потому, что сам хозяин был разрушен.

Если ты явно запустишь диструктор хозяину, то он "почистится". Но сам хозяин разрушен не будит.

А вот если он выйдет из области видимости, или будит явно удален при помощи delete, только тогда он будит разрушен. И соответственно, будут разрушены все его данные-члены, живущие в стеке.
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2011, 15:21
Цитата Сообщение от Bers Посмотреть сообщение
Конструкторы и диструкторы - самые обыкновенные методы с немножечко другим синтаксисом и немножечко дополнительными особенностями.
деструктор можно просто так вызвать, конструктор - нет
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
13.11.2011, 16:04  [ТС]
Цитата Сообщение от alex_x_x Посмотреть сообщение
конструктор - нет
Как это нет? Я выше пример выложил, где я просто так вызвал несколько раз конструктор. Или я не понял о чем вы?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2011, 16:19
Chelioss, а в чем вы компилировали?
http://codepad.org/BiKxPyhn

Добавлено через 1 минуту
те правильно f.~Foo();
но не то что вы написали, про конструкторы так совсем
0
Заблокирован
13.11.2011, 16:32
http://liveworkspace.org/code/... 34fd85d698
А vs2010 компилирует, странно... Порылся в стандарте и нигде не нашёл, что так можно или нельзя делать. В главе 12.6.1 Explicit initialization ничего подобного нет, а где ещё про это мб написано, поэтому смею предположить что это баг студии
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2011, 16:32
Помогаю со студенческими работами здесь

Конструкторы и деструкторы
Привет. Есть структура, содержащая 7 полей, в которые я ввожу значения с клавиатуры. Нужно используя конструкторы и деструкторы...

Конструкторы и деструкторы
Прочитал про конструкторы и деструкторы. Пишут что они нужны для инициализации переменных класса. Как они используются я понял, но не понял...

Конструкторы и деструкторы
#include <iostream> #include <Windows.h> class Try { public: void* px; Try() { printf("Try\n"); px=malloc(12); }; ...

Конструкторы и деструкторы
Создать класс LongLong для работы с целыми числами из 64 бит. Число должно быть представлено двумя полями: long — старшая часть, unsigned...

Конструкторы и деструкторы
Напишите простейшие примеры объявления и определения конструкторов и деструкторов. Желательно, чтобы были примеры с различными типами данных


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru