Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
12.11.2011, 00:54     Дин. выделение памяти, конструкторы/деструкторы #1
Хотел бы уточнить.
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) При вызове конструктора создаются все не статические объекты класса? Даже если вызвать конструктор в ручную?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 00:54     Дин. выделение памяти, конструкторы/деструкторы
Посмотрите здесь:

НАследуются ли конструкторы и деструкторы? C++
C++ Конструкторы/Деструкторы
C++ Конструкторы и деструкторы
C++ Классы. Конструкторы. Деструкторы
C++ Конструкторы и деструкторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.11.2011, 01:12     Дин. выделение памяти, конструкторы/деструкторы #2
Цитата Сообщение от Chelioss Посмотреть сообщение
Да и что выигрывает? Стэк или куча? Думаю, что стэк, но уточнить стоит.
в стеке шустрее создается, при использовании кучи сначала происходит поиск свободного места что отнимает время

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

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

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

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

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

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

Я на стеке сделал парочку переменных, и обращаюсь к любой из них в любой момент. Это что, дольше, чем если бы они жили в куче?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.11.2011, 03:04     Дин. выделение памяти, конструкторы/деструкторы #9
Цитата Сообщение от alkagolik Посмотреть сообщение
в при произвольном доступе - куча, при последовательном - стек. Не зряже существует и то и другое.
выделения стековой памяти самое быстрое
это очевидно из архитектуры
там мендежера нет - там управлять то почти нечем
Сыроежка
Заблокирован
12.11.2011, 21:35     Дин. выделение памяти, конструкторы/деструкторы #10
Цитата Сообщение от 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 нужно передать аргумент, который в вашем случае равен нулю. Это еще дополнительные издержки, то есть издержки по передачи аргументов в функцию. Когда же переменная создается в стеке, то компилятор просто "вшивает" инструкцию инициализации в код.

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

Что касается третьего вопроса, то конструктор вызывает сначала конструкторы базовых классов, если такие имеются, а затем конструкторы членов класса, если они также имеют свои конструкторы. Вызываются конструкторы в порядке их определения за исключением виртуальных базовых классов.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
12.11.2011, 21:56  [ТС]     Дин. выделение памяти, конструкторы/деструкторы #11
А как насчет вызова конструкторов\деструкторов несколько раз подряд? Почему это работает?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.11.2011, 22:00     Дин. выделение памяти, конструкторы/деструкторы #12
Цитата Сообщение от Chelioss Посмотреть сообщение
А как насчет вызова конструкторов\деструкторов несколько раз подряд? Почему это работает?
детализируй вопрос пожалуйста
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
12.11.2011, 22:49  [ТС]     Дин. выделение памяти, конструкторы/деструкторы #13
Цитата Сообщение от 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;
}
Bers
Заблокирован
12.11.2011, 22:52     Дин. выделение памяти, конструкторы/деструкторы #14
Цитата Сообщение от Chelioss Посмотреть сообщение
Написал пример и даже появился вопрос. Почему можно вызвать дестркутор до конструктора?
Конструкторы и диструкторы - самые обыкновенные методы с немножечко другим синтаксисом и немножечко дополнительными особенностями.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
12.11.2011, 22:55  [ТС]     Дин. выделение памяти, конструкторы/деструкторы #15
Цитата Сообщение от Bers Посмотреть сообщение
Конструкторы и диструкторы - самые обыкновенные методы с немножечко другим синтаксисом и немножечко дополнительными особенностями.
Разве при вызове конструктора/деструктора не вызываются конструкторы\деструкторы для встроенных типов?
Если так, то почему можно много раз занимать память для встроенного типа и много раз освобождать память?
Bers
Заблокирован
12.11.2011, 23:08     Дин. выделение памяти, конструкторы/деструкторы #16
Цитата Сообщение от Chelioss Посмотреть сообщение
Разве при вызове конструктора/деструктора не вызываются конструкторы\деструкторы для встроенных типов?
Диструктор автоматически запускается при разрушении объекта (если верить книгам, это единственная причина, почему он вообще существует)

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

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

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

А вот если он выйдет из области видимости, или будит явно удален при помощи delete, только тогда он будит разрушен. И соответственно, будут разрушены все его данные-члены, живущие в стеке.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.11.2011, 15:21     Дин. выделение памяти, конструкторы/деструкторы #17
Цитата Сообщение от Bers Посмотреть сообщение
Конструкторы и диструкторы - самые обыкновенные методы с немножечко другим синтаксисом и немножечко дополнительными особенностями.
деструктор можно просто так вызвать, конструктор - нет
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.11.2011, 16:04  [ТС]     Дин. выделение памяти, конструкторы/деструкторы #18
Цитата Сообщение от alex_x_x Посмотреть сообщение
конструктор - нет
Как это нет? Я выше пример выложил, где я просто так вызвал несколько раз конструктор. Или я не понял о чем вы?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.11.2011, 16:19     Дин. выделение памяти, конструкторы/деструкторы #19
Chelioss, а в чем вы компилировали?
http://codepad.org/BiKxPyhn

Добавлено через 1 минуту
те правильно f.~Foo();
но не то что вы написали, про конструкторы так совсем
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 16:32     Дин. выделение памяти, конструкторы/деструкторы
Еще ссылки по теме:

C++ Конструкторы и деструкторы
Конструкторы и деструкторы C++
Конструкторы и деструкторы C++

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

Или воспользуйтесь поиском по форуму:
LosAngeles
Заблокирован
13.11.2011, 16:32     Дин. выделение памяти, конструкторы/деструкторы #20
http://liveworkspace.org/code/d3ac41...f53834fd85d698
А vs2010 компилирует, странно... Порылся в стандарте и нигде не нашёл, что так можно или нельзя делать. В главе 12.6.1 Explicit initialization ничего подобного нет, а где ещё про это мб написано, поэтому смею предположить что это баг студии
Yandex
Объявления
13.11.2011, 16:32     Дин. выделение памяти, конструкторы/деструкторы
Ответ Создать тему
Опции темы

Текущее время: 15:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru