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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование оператора "new" 
V
    Опции темы
GLeBaTi
Дата 26.8.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Когда именно надо использовать операторы new и delete ??
PM MAIL   Вверх
Annihilator
Дата 26.8.2008, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


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

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



Хм... ну самое простое если, когда хочешь создавать переменные в run-time, т.е. по пере надобности


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
mes
Дата 26.8.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GLeBaTi @  26.8.2008,  20:35 Найти цитируемый пост)
Когда именно надо использовать операторы new и delete ?? 

имеется ввиду просто new и delete или  operator new и  operator delete?



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


Опытный
**


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

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



Цитата(mes @  26.8.2008,  20:56 Найти цитируемый пост)
имеется ввиду просто new и delete или  operator new и  operator delete?

Перефразирую для понимания. Имеется ввиду применение самих операторов или перегрузки  операторов new и delete


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 26.8.2008, 21:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(cutwater @  26.8.2008,  21:08 Найти цитируемый пост)
Имеется ввиду применение самих операторов или перегрузки  операторов new и delete 

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


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Ну вот к примеру: 
Код

CButton* button1 = new CButton;
button1->Create("OK!",WS_VISIBLE,rect1,this,101);  //здесь надо new
  ...
/**********************************************************
 *
 *********************************************************/
CRect rect1(0,0,60,60);                                               //а вот здесь, не надо...

Так в каких случаях использовать эти операторы ???
PM MAIL   Вверх
IKM2007
Дата 27.8.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


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

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



Цитата

Операция new создает объект типа имя_типа, к которому он применен. Время жизни объекта, созданного с помощью new, не ограничено областью видимости, в которой он создан. Операция new возвращает указатель на созданный ей объект. Когда объект является массивом, возвращается указатель на его первый элемент. Например, и new int и new int[10] возвращают int*. Для объектов некоторых классов надо предоставлять инициализатор . Операция new  для получения памяти вызывает функцию 
  void* operator new (long);

Параметр задает требуемое число байтов. Память будет инициализирована. Если operator new() не может найти требуемое количество памяти, то она возвращает ноль. 
Операция delete уничтожает объект, созданный операцией new. Ее результат является void. Операнд delete должен быть указателем, возвращенным new. Результат применения delete к указателю, который не был получен с помощью операции new. Однако уничтожение с помощью delete указателя со значением ноль безвредно. 
Чтобы освободить указанную память, операция delete вызывает функцию 
   void operator delete (void*);

В форме 
  delete [ выражение ] выражение

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



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
mrbrooks
Дата 27.8.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



new (и соответственно потом delete) в данном случае используются для динамического распределения памяти. Из этого и исходи. Собственно нужен ли тебе указатель или нет.
PM MAIL   Вверх
Lazin
Дата 27.8.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(GLeBaTi @ 27.8.2008,  09:26)
Ну вот к примеру: 
Код

CButton* button1 = new CButton;
button1->Create("OK!",WS_VISIBLE,rect1,this,101);  //здесь надо new
  ...
/**********************************************************
 *
 *********************************************************/
CRect rect1(0,0,60,60);                                               //а вот здесь, не надо...

Так в каких случаях использовать эти операторы ???

я не понял в чем вопрос, в первом случае вызовется оператор new, во втором нет, так как память под объект выделяется в стэке... что ты хочешь от операторов new/delete?
этот оператор должен просто вернуть указатель на область памяти, по которому будет конструироваться объект
PM MAIL Skype GTalk   Вверх
bsa
Дата 27.8.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GLeBaTi @ 27.8.2008,  09:26)
Так в каких случаях использовать эти операторы ???

Эти операторы нужно использовать тогда, когда без них никак не обойтись. Например, для идиомы pimpl без них не обойтись. Во всех остальных случаях, применение их рекомендуется избегать.
Например, если тебе нужен массив переменной длины, то можно это сделать так:
Код
#include <iostream>
...
size_t size;
std::cout << "input array size: ";
std::cin >> size;
int *array = new int[size];
....
delete []array;
Но тут необходимо всегда помнить про оператор delete в конце (более того, нужно различать delete и delete[])... Но можно тоже самое сделать так:
Код
#include <iostream>
#include <vector>
...
size_t size;
std::cout << "input array size: ";
std::cin >> size;
std::vector<int> array(size);
....
А вот тут не надо следить ни за чем - после выхода из области видимости память освободится автоматически. Не говоря уж о том, что всегда можно вызвать метод resize(), который изменит размер массива, или просто добавить (удалить) в массив элементы...
PM   Вверх
mes
Дата 27.8.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GLeBaTi @  27.8.2008,  09:26 Найти цитируемый пост)
Так в каких случаях использовать эти операторы ???

Так все таки значит просто вопрос по использованию глобального new  и delete ? 

Код



{  A a; // создание объекта в стеке
 
} // объект удаляется по выходу за границу области
..


{
   A *a =                 // присваивание указателю адреса на 
               new A(); // объект созданный в куче 
} // при коррекции стека, объект не удаляется, но указатель не доступен, поэтому будет утечка памяти

{
   A *a =                 // присваивание указателю адреса на 
               new A(); // объект созданный в куче 
    ...
     delete a; // здесь сами удалили потому что нам объект не нужен
} // при коррекции стека, объект не удаляется, но указатель не доступен, поэтому будет утечка памяти


А* CreateA ()
{
   A *a =                 // присваивание указателю адреса на 
               new A(); // объект созданный в куче 

  return a; // возврашаем указатель на объект наружу, для использования объекта и дальнейшего удаления
} // при коррекции стека, объект не удаляется, указатель не доступен, но объект не потерян, поэтому утечки памяти тут нет

А* CreateA ()
{  A a; // создание объекта в стеке
   return &a; // возврашаем указатель на стековый объект (нельзя!)
} // так как объект удаляется по выходу за границу области, и обращение к нему вызовет ошибку

А CreateA ()
{  A a; // создание объекта в стеке
   return a; // возврашаем копию объекта (можно но лишнее копирование, зависит от задачи)
} // объект удаляется по выходу за границу области, но пользоваться копией ничего не мешает


Это сообщение отредактировал(а) mes - 27.8.2008, 10:52


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



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

НЕУЖЕЛИ ТРУДНО ОТВЕТИТЬ, В КАКИХ СЛУЧАЯХ НАДО ПОД КЛАСС ВЫДЕЛЯТЬ ДИНИМИЧЕСКУЮ ПАМЯТЬ ???)))))

PM MAIL   Вверх
bsa
Дата 27.8.2008, 11:10 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GLeBaTi @ 27.8.2008,  10:56)
НЕУЖЕЛИ ТРУДНО ОТВЕТИТЬ, В КАКИХ СЛУЧАЯХ НАДО ПОД КЛАСС ВЫДЕЛЯТЬ ДИНИМИЧЕСКУЮ ПАМЯТЬ ???)))))

Под классы выделять память не нужно! Нужно выделять под объекты классов (под переменные, другими словами). Выделять нужно тогда и только тогда, когда за тебя это никто не сделает. Когда ты пишешь MyClass var, то за тебя выделяет память компилятор. Когда ты пишешь MyClass *pointer, то ты берешь на себя обязательства как-нибудь инициализировать указатель. Есть два варианта: либо присвоить адрес существующего объекта, либо создать новый с помощью new.
Если все еще непонятно - беги срочно в магазин, покупай книжку по программированию (С++) для начинающих и читай до просветления!
PM   Вверх
mes
Дата 27.8.2008, 11:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GLeBaTi @  27.8.2008,  10:56 Найти цитируемый пост)
НЕУЖЕЛИ ТРУДНО ОТВЕТИТЬ, В КАКИХ СЛУЧАЯХ НАДО ПОД КЛАСС ВЫДЕЛЯТЬ ДИНИМИЧЕСКУЮ ПАМЯТЬ ???)))))

это большая тайна под семью печатями.  smile 
Цитата(bsa @  27.8.2008,  11:10 Найти цитируемый пост)
беги срочно в магазин, покупай книжку по программированию (С++) для начинающих 

ну все секретные места сдал ))


P.S. 
GLeBaTi, проверьте, пожалуйста, что там у Вас с клавой .. не шифт ли заклинил? а то слишком громко пишет..  smile 


Это сообщение отредактировал(а) mes - 27.8.2008, 11:31


--------------------
PM MAIL WWW   Вверх
GLeBaTi
Дата 27.8.2008, 12:03 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Не могли порсто сказать: "new - для создания указателя на объект переменной длины"
PM MAIL   Вверх
mes
Дата 27.8.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GLeBaTi @  27.8.2008,  12:03 Найти цитируемый пост)
Не могли порсто сказать: "new - для создания указателя на объект переменной длины" 

судя по фразе Вы даже не ознакомились с примером : http://forum.vingrad.ru/index.php?showtopi...t&p=1623276

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



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


Эксперт
****


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

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



Цитата(GLeBaTi @ 27.8.2008,  12:03)
Не могли порсто сказать: "new - для создания указателя на объект переменной длины"

Нет. потому что это не так.
PM   Вверх
GLeBaTi
Дата 27.8.2008, 12:15 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



ppc... я знаю что нужен для создания объекта в динамической памяти, я спрашивал в каких случаях нужно его использовать - 
в тех случаях когда надо определить указатель на объект нужной длины...
PM MAIL   Вверх
bsa
Дата 27.8.2008, 12:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GLeBaTi @ 27.8.2008,  12:15)
в тех случаях когда надо определить указатель на объект нужной длины...

Опять неправильно.
И вообще, понятия "объект переменной длины" нет. Есть массивы переменной длины. Но new используется не только для них: http://www.insidecpp.ru/patterns/pimpl_idiom/

Добавлено @ 12:23
Уже сто раз было сказано, что new нужно для создания объектов в "куче" (не в стеке), так как стековые объекты уничтожаются при выходе из области видимости (изнутри фигурных скобок), а те, что в куче, живут или до уничтожения оператором delete, или до завершения работч программы.

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Ладно, спасибо, Я уже разобрался... smile 
PM MAIL   Вверх
mes
Дата 27.8.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GLeBaTi @  27.8.2008,  12:15 Найти цитируемый пост)
ppc... я знаю что нужен для создания объекта в динамической памяти, я спрашивал в каких случаях нужно его использовать - 
в тех случаях когда надо определить указатель на объект нужной длины... 


Код

const char *c = "Hello Word"; // ну вот мы определили указатель на обьект нужной длины и обошлись без new ))


указатель на объект и объект - два разных понятия.. и с помошью оператора "=" мы их связываем т.е присваеваем (записываем в память указателя) адрес объекта, но не присваеваем указателю сам объект или его память. Т
Так же когда вносим в телефоную книжку номер телефона, мы никак не воздействуем на сам телефон. Нам это лишь дает возможность воспользоваться услугами конкретно выбранного объекта (из кучи других ) , при условии если он может нам их представить (не поломан и не отключен).
 smile 


Это сообщение отредактировал(а) mes - 27.8.2008, 12:52


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



...а если надо изменить размер массива?...перекомпилировать будем ???
С помощью new можно выделять память динамически во время выполнения снимает с ваших программ зависимость от фиксированных размеров массивов.
PM MAIL   Вверх
bsa
Дата 27.8.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GLeBaTi @ 27.8.2008,  12:49)
...а если надо изменить размер массива?...перекомпилировать будем ???
С помощью new можно выделять память динамически во время выполнения снимает с ваших программ зависимость от фиксированных размеров массивов.

читаем про std::vector.
Кроме new/delete есть еще Сишные средства: calloc/malloc/realloc/free
Я уже привел пример, когда new используется не для массивов.
PM   Вверх
Lazin
Дата 27.8.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(GLeBaTi @  27.8.2008,  12:15 Найти цитируемый пост)
ppc... я знаю что нужен для создания объекта в динамической памяти, я спрашивал в каких случаях нужно его использовать - 
в тех случаях когда надо определить указатель на объект нужной длины... 


постараюсь объяснить проще...

допустим есть класс

Код

class Foo
{
    int foo;
public:
    Foo() : foo(0)
    {
    }
};


такой класс только один, далее нам нужно его использовать, для этого нужно  создать экземпляр этого класса. как это происходит:
  • сначала под объект выделяется память, как минимум sizeof(Foo) байт, эта память непроинициализирована, она может быть заполнена любыми данными...
  • далее для этой области данных вызывается конструктор. конструктор заполняет ее данными, в данном примере там будет 4 нулевых байта, после вызова конструктора в этой области памяти существует экземпляр класса Foo (не сам класс!) конструктор в свою очеред может создавать другие объекты...

память под объект может выделяться в стеке и в куче
в стеке она выделяется так:
Код

Foo object;

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

в куче память выделяется так:
Код

Foo* pobject = new Foo();

здесь pobject это указатель на объект расположеный в куче, то-есть по сути адрес объекта. Память в куче выделяется менеджером памяти, который реализуется библиотекой времени выполнения (CRTL), и выделяется она сравнительно долго. Объекты находящиеся в куче нужно удалять вручную, так как к стеку они не привязаны(если конечно специально об этом не позаботиться) и при его раскрутке не будут удалены. Но зато  куче можно размещать оч. большие объекты.

Так-же существует возможность немного изменить это поведение с помощью переопределения операторов new/delete. Это редко используется, так как редко бывает нужно. Задача переопределенного оператора new - возвратить указатель на область памяти, в котором потом будет создаваться объект. Еще нужно сказать, что если ты переопределяешь оператор  new, то прийдется переопределить  оператор delete, а так-же nothrow версию new, а так-же new []

PM MAIL Skype GTalk   Вверх
mes
Дата 27.8.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GLeBaTi @  27.8.2008,  12:49 Найти цитируемый пост)
С помощью new можно выделять память динамически во время выполнения снимает с ваших программ зависимость от фиксированных размеров массивов. 


Во первых  new не только для массивов. 
Во вторых  чтоб иметь динамические массивы не обязательно пользоваться открытым new. 

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

Это сообщение отредактировал(а) mes - 27.8.2008, 12:57


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Lazin: вот то, что я хотел услышать))) Спасибо.

Добавлено через 5 минут и 5 секунд
А вот когда создаёшь кнопку: CButton, надо выделять под нее память в стеке или в куче ?
PM MAIL   Вверх
mes
Дата 27.8.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GLeBaTi @  27.8.2008,  12:58 Найти цитируемый пост)
А вот когда создаёшь кнопку: CButton, надо выделять под нее память в стеке или в куче ?

в куче.. иначе при раскрутке стека она уничтожится..


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


Эксперт
****


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

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



Цитата(GLeBaTi @ 27.8.2008,  12:58)
Lazin: вот то, что я хотел услышать))) Спасибо.

Добавлено @ 13:04
А вот когда создаёшь кнопку: CButton, надо выделять под нее память в стеке или в куче ?

Думаю, тебе с этим вопросом лучше в раздел по MFC обратиться... Но, на сколько мне известно, уже и MS от этого MFC отказываться начала. Пора переходить на что-то более современное и удобное.
PM   Вверх
GLeBaTi
Дата 27.8.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Раскрутка стека - это когда при запуске исключения автоматически вызываются деструкторы всех стековых
объектов между throw и catch.
  Значит, если объект будет создан в куче, и вызовется исключение, то объект не уничтожится ??

Добавлено через 2 минуты и 2 секунды
Скоро я начну изучеть .Net framework 
PM MAIL   Вверх
mes
Дата 27.8.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GLeBaTi @  27.8.2008,  13:35 Найти цитируемый пост)
Раскрутка стека - это когда при запуске исключения автоматически вызываются деструкторы всех стековых
объектов между throw и catch.

нет.. об исключениях речи не было.. раскрутка стека происходит при выходе за границы области видимости


Код

{  //  - запоминание позиции в стеке 
   int a=2; //  создание в стеке переменной a
   int b;  //  создание в стеке переменной a
} // вышли за область видимости - раскрутка стека  > удаление больше не нужных обьектов a и b  и возврат к запомненой позиции 
 


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


Это сообщение отредактировал(а) mes - 27.8.2008, 13:48


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


Эксперт
****


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

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



Цитата(GLeBaTi @ 27.8.2008,  13:35)
Раскрутка стека - это когда при запуске исключения автоматически вызываются деструкторы всех стековых
объектов между throw и catch.
  Значит, если объект будет создан в куче, и вызовется исключение, то объект не уничтожится ??
нет, не уничтожится. но для его уничтожения существуют всякие стандартные "штуки", типа std::auto_ptr
Цитата(GLeBaTi @ 27.8.2008,  13:35)
Скоро я начну изучеть .Net framework
Я вообще-то не это имел в виду, а QT...  smile 
PM   Вверх
GLeBaTi
Дата 27.8.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Что-то я не помню чтобы в теме, говорилось о том, что при выходе из области видимости, происходит удаление ненужных объектов из стека...
  
PM MAIL   Вверх
W4FhLF
Дата 27.8.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Плохо у тебя с памятью парень. 

Цитата(IKM2007 @  27.8.2008,  10:05 Найти цитируемый пост)
Время жизни объекта, созданного с помощью new, не ограничено областью видимости, в которой он создан.


Цитата(bsa @  27.8.2008,  12:17 Найти цитируемый пост)
Уже сто раз было сказано, что new нужно для создания объектов в "куче" (не в стеке), так как стековые объекты уничтожаются при выходе из области видимости


Цитата(Lazin @  27.8.2008,  12:51 Найти цитируемый пост)
недостаток этого метода в том, что объект живет не долго, как только он выходит из области видимости, он уничтожается, а память освобождается





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GLeBaTi
Дата 27.8.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



аааа, я спутал область видимости с переполнением)))...во я дурак))

Цитата
недостаток этого метода в том, что объект живет не долго, как только он выходит из области видимости, он уничтожается, а память освобождается

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


found myself
****


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

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



Тогда память под объект резервируется в глобальной секции данных ещё на этапе компиляции. 

Это сообщение отредактировал(а) W4FhLF - 27.8.2008, 14:17


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mes
Дата 27.8.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GLeBaTi @  27.8.2008,  14:11 Найти цитируемый пост)
А если объект создать статический ??? То тогда память не освобождается... 

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

Это сообщение отредактировал(а) mes - 27.8.2008, 14:20


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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Пора закрывать эту тему))) Всем спасибо) smile 
PM MAIL   Вверх
NebelDT
Дата 30.9.2008, 20:38 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



new (и соответственно потом delete) в данном случае используются для динамического распределения памяти. Например неизвестна длинна массива!!! smile 
Код

#include <stdio.h>
main()
{
int i=0,j=0,N=0,M=1,K=1,X=0,MIN=1000;
int *A=new int[N];
scanf("%d",&N);
for(i=0;i<N;i++){
     scanf("%d",&A[i]);
}
for(i=0;i<N;i++){
   for(j=0;j<N;j++){
      if(A[i]==A[j]&&i!=j){M++;       }
      if(M>K)             {K=M;X=A[i];}
      if(A[i]<MIN)        {MIN=A[i];  }
}
M=1;
}
if(N==1){X=A[0];}
if(K==1){X=MIN; }
printf("%d",X);
return (0);
}

PM MAIL WWW YIM   Вверх
GLeBaTi
Дата 1.10.2008, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



сПАсибоЮ, но я уже полностью разобрался)
PM MAIL   Вверх
bsa
Дата 1.10.2008, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NebelDT @ 30.9.2008,  20:38)
Например неизвестна длинна массива!!!

Ты не поверишь! Но можно и так:
Код
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
   int n;
   std::cout << "Input array size: " << std::flush;
   std::cin >> n;
   int array[n]; //вот это массив неизвестного изначально размера
   for(int i = 0; i < n; ++i) {
        std::cout << "Input value of array[" << i << "]: " << std::flush;
        std::cin >> array[i];
   }
   std::cout << "Input array is:\n";
   std::copy(array, array + n, std::ostream_iterator<int>(std::cout, "\n"));
   return 0;
}
И прекращай поднимать старые и/или решенные темы. Лучше просто читай, что в них написано. А то, по всей видимости, ты не очень разбираешься в вопросе. А приведенный тобой пример вообще на Си написан, если не считать пресловутого new. Более того, этот пример некорректен, так как нет соответствующего delete[], а так же тем, что оформление не соответствует ни каким правилам (например, не рекомендуется на одной строчке размещать более одного оператора (if(x) { y = t; } - это плохо), большими буквами принято называть только макроопределения, а не переменные).
PM   Вверх
GLeBaTi
Дата 1.10.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Извини, но,кажется, что: 
Код

std::cin >> n;
int array[n];

не скомпилируется, т.к компилятор должен знать размер массива до компиляции. smile 

PM MAIL   Вверх
J0ker
Дата 1.10.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GLeBaTi @ 1.10.2008,  15:40)
Извини, но,кажется, что: 
Код

std::cin >> n;
int array[n];

не скомпилируется, т.к компилятор должен знать размер массива до компиляции. smile

а ты попробуй
динамические массивы еще в 98-м кажется ввели

что за ботва... я абсолютно помню что вводили...


Это сообщение отредактировал(а) J0ker - 1.10.2008, 17:41


--------------------
user posted image
PM MAIL   Вверх
Fazil6
Дата 1.10.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bsa @  1.10.2008,  08:14 Найти цитируемый пост)
Ты не поверишь! Но можно и так:


Цитата(J0ker @  1.10.2008,  16:41 Найти цитируемый пост)
а ты попробуй
динамические массивы еще в 98-м кажется ввели 


Вау!!! Я что-то пропустил?
PM MAIL   Вверх
J0ker
Дата 1.10.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Fazil6 @ 1.10.2008,  17:06)
Цитата(bsa @  1.10.2008,  08:14 Найти цитируемый пост)
Ты не поверишь! Но можно и так:


Цитата(J0ker @  1.10.2008,  16:41 Найти цитируемый пост)
а ты попробуй
динамические массивы еще в 98-м кажется ввели 


Вау!!! Я что-то пропустил?

ммм... изучаю вопрос...


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 1.10.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(J0ker @ 1.10.2008,  17:41)
Цитата(Fazil6 @ 1.10.2008,  17:06)
Цитата(bsa @  1.10.2008,  08:14 Найти цитируемый пост)
Ты не поверишь! Но можно и так:


Цитата(J0ker @  1.10.2008,  16:41 Найти цитируемый пост)
а ты попробуй
динамические массивы еще в 98-м кажется ввели 


Вау!!! Я что-то пропустил?

ммм... изучаю вопрос...

вопрос изучен
variable-sized arrays были введены в C99 - который сейчас является C-стандартом, и, эатем, в C++98 - который НЕ является C++ стандартом
Т.о. это поддерживается компиляторами, заявленными как C-complaint (GCC например)
VC этот стандарт не поддерживает на данный момент
будет ли это добавлено в новом стандарте пока не знаю - выясню напишу


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 1.10.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(J0ker @  1.10.2008,  18:01 Найти цитируемый пост)
будет ли это добавлено в новом стандарте пока не знаю - выясню напишу 

вроде-бы не будет - во всяком случае я не нашел...


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

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

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

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

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


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

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


 




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


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

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