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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Понятие принципа создание динамических объектов 
:(
    Опции темы
mister2010
Дата 3.6.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Например я написал такой код:
Код

#include <iostream>
#include <string>

using namespace std;

class Box
{
     public:
           double width;
           int z;
           Box(char *u) { cout<<u<<endl; };
           Box(int rediska) { cout<<rediska; };
           Box() {};
     };

int main()
{
     setlocale(0,"");

     Box *d1 = new Box("Привет клоун");
     Box *d2 = new Box(7);
     Box * lyk = new Box;
     Box(); 

     delete d1;
     delete d2;

     cin.get();
}



Для того чтоб создать объект статически, то есть память по которой будет хранится объект это стек - память выделяемая во время выполнения для моего екзе ОП памятью. То есть вот это 
Код
Box induk; //Создание объекта который будет иметь имя индюк


Когда же я написал: 
Код
Box * lyk = new Box;

Это означает что я объявил указатель под названием лук, который ссылается на область памяти по которой лежит что-то из класса, и этот указатель лук после того как сослался на область памяти по которой к примеру лежит переменная z из класса Box, указатель лук присваивает себе эту область памяти;  

1)Где тут создается объект динамический, если это указатель на что-то из класса?
2)Почему, чтоб получить доступ динамически к классу нужно именно 
писать имя указателя который содержит в себе область памяти по которой лежит что-то из класса?
PM MAIL   Вверх
jonie
Дата 3.6.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата


1)Где тут создается объект динамический, если это указатель на что-то из класса?
указатель находится в стеке (и займет на x86 32 бита), а сам объект в Heap (куче) и может занять много больше места, чем доступно в стеке.
Цитата

2)Почему, чтоб получить доступ динамически к классу нужно именно 
писать имя указателя который содержит в себе область памяти по которой лежит что-то из класса? 
см выше.

Физически в памяти это будет выглядет так
user posted image

Uploaded with ImageShack.us
Т.е. тебе сначала нужно получить адрес в памяти размещенного обекта (эти самые 4-е байта), а уже затем по смещению получать доступ к данным класса (смещение расчитывается компилятором).


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mister2010
Дата 3.6.2010, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




1) 
Код

Т.е. тебе сначала нужно получить адрес в памяти размещенного обекта (эти самые 4-е байта)


Какой памяти, стека или кучи, получить указателем лук?

2)Чем отличается куча от стека?
PM MAIL   Вверх
jonie
Дата 3.6.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата


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

2)Чем отличается куча от стека? 
 в модели памяти flat [http://en.wikipedia.org/wiki/Flat_memory_model] принципиально ничем. Другое дело, что компилятор под стек выделяет определенное количество памяти (около 4-х мегабайт) - т.е. его может не хватить под большие объекты.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mister2010
Дата 3.6.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1)А чо так? Указатель находится в стеке ,а объект в куче?
 Стек - это часть оп. памяти и куча это часть оп памяти? 

2) 
Код

Т.е. тебе сначала нужно получить адрес в памяти размещенного объекта

Указателем лук?
Как объект буде называться,который мы получаем?

3) Где статически хранятся объекты а где динамические хранятся?

4)Последнее, что тревожит, если создать статически объект, он имеет имя, а динамически, 
какое имя имеет объект?
PM MAIL   Вверх
Леопольд
Дата 3.6.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mister2010, не стоит путать динамическое и статическое время жизни. Статическое означает что инстанс (объект) живёт всё время жизни процесса(на стеке). Динамический же постоянно создаётся и уничтожается и он тоже может находиться на стеке, например, нестатические локальные переменные внутри функции.

Это сообщение отредактировал(а) Леопольд - 3.6.2010, 21:59


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
djamshud
Дата 3.6.2010, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



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

Добавлено через 3 минуты и 31 секунду
>Стек - это часть оп. памяти и куча это часть оп памяти?

Стек - эта такая "подвижная" штука. Например вызываете функцию, на стек попадают ее внутренние переменные и возможно параметры функции. Вызвали следующую - опять, но уже для нее. Вышли из второй функции - стек отмотался, вышли из первой - вернулся в исходное состояние.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Леопольд
Дата 3.6.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mister2010, когда программа запускается на выполнение, операционная система выделяет её ресурсы, строго отведённое количество (зависит от настроек и от ОС). Стек один из этих ресурсов (поэтому при бесконечной рекурсии возникает переполнение стека). Куча, грубо говоря, тоже выдаётся процессу но уже в рантайме, чем больше процесс выделяет памяти при помощи new, malloc и т.п. системных вызовов (т.е. процесс обращается к системе за ресурсом), тем большая куча ему выдаётся. Но, в рантайме (поэтому называют динамически) может обращаться не только за памятью. Можно, например, содавать потоки, которые на многоядерных процессорах будут выполняться на самом деле парралельно. Обращаться к файлам, всевозможным девайсам. В общем, грубо говоря, всё это сводится к "системным вызовам". Поэтому иногда просто необходимо знать как работает целевая ОС и какими возможностями обладает.

З.Ы. Вполне вероятно, что ОС может позволить увеличить стек в рантайме. Тут всё от неё зависит.

Это сообщение отредактировал(а) Леопольд - 3.6.2010, 22:09


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 3.6.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Леопольд @  3.6.2010,  21:06 Найти цитируемый пост)
когда программа запускается на выполнение, операционная система выделяет её ресурсы, строго отведённое количество (зависит от настроек и от ОС). Стек один из этих ресурсов (поэтому при бесконечной рекурсии возникает переполнение стека). 

куча тоже не безразмерна... 
Ну и самое главное отличие кучи от стека не в этом.. даже просто вдумчивое прочтение названий даст ответ на это.



--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 3.6.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djamshud @  3.6.2010,  22:00 Найти цитируемый пост)
Помимо стека и кучи есть еще область статической памяти, в которую попадают константы, глобальные и статические переменные.
Скорее не то что-бы она статическая. Здесь лучше подойдёт read-only доступ. Т.е. строковые литералы, константы, собственно сам исполняемый машинный код...



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mister2010
Дата 3.6.2010, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



То есть то ,что в коде программы написано статически, при запуске файла екзе на компе, оперативной памятью выделяется часть памяти для хранения этого статического,эта память назыв. стек, а то что в программе написано операцией new , оперативная память выделяет тоже част ь памяти только её называют куча?

Это сообщение отредактировал(а) mister2010 - 3.6.2010, 22:15
PM MAIL   Вверх
Леопольд
Дата 3.6.2010, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  3.6.2010,  22:11 Найти цитируемый пост)
Ну и самое главное отличие кучи от стека не в этом.
Всё это зависит от ОС. Мне скоро предстоит под OSE программировать. Я пока не понял как там вообще с кучей дела обстоят. Пока что, у меня сложилось впечатление что размер кучи задаётся при компиляции... Хотя, насчёт главного отличия спорить не буду. smile

Добавлено @ 22:17
Цитата(mister2010 @  3.6.2010,  22:13 Найти цитируемый пост)
что в коде программы написано статически
 smile Стек он и в Африке стек. Перечитай пост mes'а. Разберись что на самом деле значит вызов функции и рекурсия, это поможет понять.


Это сообщение отредактировал(а) Леопольд - 3.6.2010, 22:19


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 3.6.2010, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



mister2010, нет
существуют три вида хранения:
 статическое - на протяжении выполнения программы 
 автоматическое -  на протяжении выполнения функционального блока 
 динамическое - определяется клиентом 

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

 
 

Это сообщение отредактировал(а) mes - 3.6.2010, 22:26


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 3.6.2010, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



Леопольд, она rw. И называется статической.

Добавлено через 1 минуту и 2 секунды
Код

int foo; //в статической памяти. Можно читать и писать.

int main(){
return 0;}



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Леопольд
Дата 3.6.2010, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djamshud @  3.6.2010,  22:20 Найти цитируемый пост)
Леопольд, она rw. И называется статической.
Видимо так и есть. Однако константы, строковые литералы и машинный код обычно лежат в ro.

З.Ы. У меня сейчас каша какая-то в голове с этой OSE...



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mister2010
Дата 3.6.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Статические объекты хранятся в стеке,части оп памяти ,а динам. объекты в куче, части оп памяти. Так?
PM MAIL   Вверх
djamshud
Дата 3.6.2010, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



mister2010, переменные, объявленные в функции, параметры функций проходят через стек - часть оп. Динамически созданные хранятся в куче, части оп.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mister2010
Дата 3.6.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всё хранится в виде объектов в статической и динамической памяти? Если да, то почему?
PM MAIL   Вверх
djamshud
Дата 3.6.2010, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



Вы ЕГЭ по информатике онлайн сдаете что ли?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mister2010
Дата 3.6.2010, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да нет, так чтоб понять для себя.
PM MAIL   Вверх
mister2010
Дата 3.6.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как грамотно ответить что означает вот это объявление первой и второй строки?

Код

     Box *d 

     В= new Box;


Это сообщение отредактировал(а) mister2010 - 3.6.2010, 23:37
PM MAIL   Вверх
djamshud
Дата 3.6.2010, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



Код

     Box *d; //создание указателя на стеке
     В= new Box;//создание объекта в куче. d указывает на область памяти под этим объектом (по сути указывает на этот объект).



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mister2010
Дата 3.6.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

 Box *d; //создание указателя на стеке.----> переменная d будет находится в памяти стека в виде объекта?


d  -  это ведь не объект, это только переменная которая будет содержать адрес объекта, какого?
Как узнать имя  динамического объекта?
PM MAIL   Вверх
djamshud
Дата 3.6.2010, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>это только переменная которая будет содержать адрес объекта, какого?

Да. Переменная создается на стеке, объект - в куче. Переменная содержит адрес этого объекта

>Как узнать имя  динамического объекта?

Имя? Переменной-указателя - никак. На один объект может указывать стопицот указателей. Название типа - через RTTI, но это не используется в обычной практике.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mister2010
Дата 4.6.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

 Переменная создается на стеке, объект - в куче


1)А статические объекты тоже в куче создаются ? Стек не содержит объектов?
2) Box *d = new Box;  
d это только переменная которая будет содержать адрес объекта, а почему объекта?

Если я напишу d->ser();   Где тут указание на объект?
Это указатель на функцию класса.

Это сообщение отредактировал(а) mister2010 - 4.6.2010, 00:10
PM MAIL   Вверх
djamshud
Дата 4.6.2010, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>А статические объекты тоже в куче создаются ?

Они создаются в третьей области памяти - статической. Я же писал об этом!

>Стек не содержит объектов?

Box d создает объект d типа Box на стеке. В вашем же примере d=new Box стек объектов не содержит.

>а почему объекта?

Потому что new Box создают новый объект типа Box.

>Если я напишу d->ser();   Где тут указание на объект?

d - "указание на объект". А ->ser() вызов функции (метода) этого объекта.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mister2010
Дата 4.6.2010, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

d - "указание на объект". А ->ser() вызов функции (метода) этого объекта. 


"указание на объект" - Как узнать на какой объект ссылается указатель д если как вы говорите у динамического объекта нету имени?


Это сообщение отредактировал(а) mister2010 - 4.6.2010, 00:26
PM MAIL   Вверх
djamshud
Дата 4.6.2010, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>"указание на объект" - Как узнать на какой объект ссылается указатель д если как вы говорите у динамического объекта нету имени?

Неправильно:
Код

d=new Box//d указывает на новый объект
d=new Box//старый объект просран (но в памяти все равно где-то валяется). d указывает на еще один вновь созданный объект


Правильно:
Код

d1=new Box
d2=new Box
d=...//в ходе каких-нибудь манипуляций присваиваем d1 или d2
if(d==d1)...//так мы узнаем, что d ссылается на объект из-под первого new Box
if(d==d2)...//аналогично, но теперь - на второй.



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mister2010
Дата 4.6.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

if(d==d1)...//так мы узнаем, что d ссылается на объект из-под первого new Box
if(d==d2)...//аналогично, но теперь - на второй.


На какой объект я так и не понял?
Например возьмём первый иф. Если объект под именем d равен объекту по имени d1, тогда что может быть?
Каким образом я в этом случаи узнаю на какой объект ссылается указатель от этой строки?
Код

Box * d = new Box;


Это сообщение отредактировал(а) mister2010 - 4.6.2010, 00:56
PM MAIL   Вверх
djamshud
Дата 4.6.2010, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>Каким образом я в этом случаи узнаю на какой объект ссылается указатель от этой строки?

После этой строки d будет указывать на только что созданный объект. Оператор new как раз возвращает этот указатель, а d= - присваивает его указателю d. То есть вы знаете об этом. Вы его создали и помните, что d - это вооон тот объект.

В общем попробуйте сами подумать и поэкспериментировать. Я спать. И вам спокойной ночи.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mister2010
Дата 4.6.2010, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А где вы видите этот только что созданный объект где он создался, я не вижу покажи в каком месте?
PM MAIL   Вверх
djamshud
Дата 4.6.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



Код

Box *d=new Box;


Вот здесь я вижу, что создался новый объект.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
bsa
Дата 4.6.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



mister2010, почитай про указатели в FAQ.

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

Компилятор дает возможность программисту выбрать, где ему размещать переменную:
Код
int x; //статическая память
int main()
{
   static int y; //тоже статическая
   int z; //стековая
   new int; //динамическая
   malloc(sizeof(int)); //тоже динамическая
}


В этом примере теряется доступ к переменным в динамической памяти, так как не были сохранены их адреса. Чтобы исправить это, необходимо присвоить результат выполнения new и malloc некому указателю. Как написано в приведенном выше FAQ, указатель это такая переменная, которая содержит адрес другой переменной. Что называется "указывает":
Код
int main()
{
   int *p; //создаем переменную типа "указатель на int" в стековой области памяти
   p = new int; //создаем переменную типа int в динамической области памяти и присваиваем указатель на нее переменной p
   *p = 0; //присваиваем переменной в динамической памяти значение 0
   int *m = p; //создаем новый "указатель на int" и присваиваем ему значение p
   *m = 10; //присваиваем той же самой переменной в динамической памяти значение 10
   printf("%d == %d\n", *p, *m); //на экране получим 10 == 10
   delete m; //освобождаем память, выделенную под переменную в динамической памяти
   p = 0;
   m = 0; //зануляем указатели, так как дальнейшее использование переменной, на которую они ссылались, невозможно.
}


Это сообщение отредактировал(а) bsa - 4.6.2010, 12:41
PM   Вверх
mister2010
Дата 4.6.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Статичекая память выделяется оп. памябтью только на этапе компиляци только? Когда уже программа скомпилина, оперативная память работает с программой выделяя только ей стековую  и динамическую память и больше никакую?


Код

Box *d=new Box;
Вот здесь я вижу, что создался новый объект. 


Который имеет имя д? Или он есть а мы не знаем как он называется?
PM MAIL   Вверх
mes
Дата 4.6.2010, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mister2010 @  4.6.2010,  17:47 Найти цитируемый пост)
Статичекая память выделяется оп. памябтью только на этапе компиляци только?

на этапе компиляции ничего не выделяется...
не "статическая память" а область памяти предназначенная для хранения статических объектов.

Цитата(mister2010 @  4.6.2010,  17:47 Найти цитируемый пост)
Когда уже программа скомпилина, оперативная память работает с программой выделяя ей..

оперативная память ничего не выделяет - выделяет ось.

Цитата(mister2010 @  4.6.2010,  17:47 Найти цитируемый пост)
только стековую  и динамическую память и больше никакую?

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

p.s. правильней сказать не "три хранилища" , а "три способа хранения". за подробностями в книжку smile

Добавлено через 4 минуты и 46 секунд
Цитата(mister2010 @  4.6.2010,  17:47 Найти цитируемый пост)
Который имеет имя д? Или он есть а мы не знаем как он называется? 

не у каждого объекта есть имя..  new создает безъимянный объект, чтоб до него можно было добраться (обычно) его адрес присваивают указателю.
Код

Box *d             // созданному на стеке объекту-указетелю
       =           // присваиваем               
         new Box;  // адрес безымянного, созданного в куче, объекта.




--------------------
PM MAIL WWW   Вверх
bsa
Дата 4.6.2010, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



mister2010, рекомендую почитать книжки об устройстве компьютера, чтобы понимать какой узел за что отвечает. Чтобы не было потом "оперативная память выделяет". Это звучит так же, как "земля выделяет участок под посевы озимых".   smile 
PM   Вверх
mister2010
Дата 5.6.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Скажите одно, в чём различие стековой памяти от статической в программировании?
PM MAIL   Вверх
mes
Дата 5.6.2010, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mister2010 @  5.6.2010,  13:57 Найти цитируемый пост)
Скажите одно, в чём различие стековой памяти от статической в программировании? 

в памяти никакой.. разница в способе обращения/работы с ней.. прежде всего посмотрите что есть _стек_ в программировании .. гугль в помощь. 
smile


--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 7.6.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mister2010, интернет + google = информация


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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