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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
#1

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

12.11.2011, 00:54. Просмотров 1641. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 00:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дин. выделение памяти, конструкторы/деструкторы (C++):

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

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

Конструкторы и деструкторы - C++
Здравствуйте уважаемые программисты, помогите пожалуйста новичку? Не могу разобраться в программе, где смог там написал комментарий и то не...

Конструкторы и деструкторы - C++
Код: #include <iostream> #include <stdlib.h> #include <conio.h> class complex { private: double im; double...

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

Конструкторы и деструкторы - C++
Не понимаю, как закончить программу. Написала конструктор и деструктор, хотя он тут и не нужен по идее. Но по заданию сделала. А как...

28
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 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 ]
инициализируется мусором если их не инициализировать в конструкторе
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
12.11.2011, 01:15  [ТС] #3
Почему можно вызвать сколько угодно раз подряд деструктор/конструктор?
0
DenCHS200
32 / 32 / 1
Регистрация: 07.10.2011
Сообщений: 117
12.11.2011, 01:23 #4
Постараюсь ответить на 1й вопрос:
2й вариант кода, это создаётся указатель на переменную int.Если не ошибаюсь, то стек работает быстрее кучи. 2й вариант, это уже динамическое выделение памяти , её в основном , используют при создании динамических массивов (Их размерность может меняться ),или для извлечения адреса(отладка, дизассемблирование и так далее), или при передаче параметров функции(например, указатель на массив) .По идее, 1й код должен быстрее работать, так как разница в скорости возникает в то время, когда нужно занять/освободить место в памяти. Стек всегда готов к размещению новых данных и всегда готов у удалению данных. А кучей по сути является свободное пространство в памяти и для того чтоб разместить в ней данные, нужно обратиться к менеджеру памяти, менеджер памяти найдет свободное место нужного размера в памяти, зарегистрирует его как занятый и вернет адрес этого блока в программу. При удалении блока данных из кучи так же нужно обратиться к менеджеру памяти, менеджер памяти пометит данный кусок памяти как свободный. А так указателями редко пользуюсь при написании простых программ.Хотя может ещё какое применение у них
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
12.11.2011, 01:41  [ТС] #5
Цитата Сообщение от DenCHS200 Посмотреть сообщение
2й вариант, это уже динамическое выделение памяти , её в основном , используют при создании динамических массивов
Да причем тут это? Я про механизм, а не как этим пользуются, спрашиваю.
Цитата Сообщение от DenCHS200 Посмотреть сообщение
или при передаче параметров функции(например, указатель на массив)
Указателю на массив пофиг на что он указывает. На дин. выделенную память или нет. И то и то работает, и то и то используют.
Цитата Сообщение от DenCHS200 Посмотреть сообщение
когда нужно занять/освободить место в памяти.
А для не дин. объектов уже занимать память не надо?

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

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

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

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

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

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

Что касается третьего вопроса, то конструктор вызывает сначала конструкторы базовых классов, если такие имеются, а затем конструкторы членов класса, если они также имеют свои конструкторы. Вызываются конструкторы в порядке их определения за исключением виртуальных базовых классов.
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
12.11.2011, 21:56  [ТС] #11
А как насчет вызова конструкторов\деструкторов несколько раз подряд? Почему это работает?
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.11.2011, 22:00 #12
Цитата Сообщение от Chelioss Посмотреть сообщение
А как насчет вызова конструкторов\деструкторов несколько раз подряд? Почему это работает?
детализируй вопрос пожалуйста
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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;
}
0
Bers
Заблокирован
12.11.2011, 22:52 #14
Цитата Сообщение от Chelioss Посмотреть сообщение
Написал пример и даже появился вопрос. Почему можно вызвать дестркутор до конструктора?
Конструкторы и диструкторы - самые обыкновенные методы с немножечко другим синтаксисом и немножечко дополнительными особенностями.
1
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
12.11.2011, 22:55  [ТС] #15
Цитата Сообщение от Bers Посмотреть сообщение
Конструкторы и диструкторы - самые обыкновенные методы с немножечко другим синтаксисом и немножечко дополнительными особенностями.
Разве при вызове конструктора/деструктора не вызываются конструкторы\деструкторы для встроенных типов?
Если так, то почему можно много раз занимать память для встроенного типа и много раз освобождать память?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2011, 22:55
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
12.11.2011, 22:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru