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

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

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

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

12.11.2011, 00:54. Просмотров 1635. Ответов 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++
Не понимаю, как закончить программу. Написала конструктор и деструктор, хотя он тут и не нужен по идее. Но по заданию сделала. А как...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Bers
Заблокирован
12.11.2011, 23:08 #16
Цитата Сообщение от Chelioss Посмотреть сообщение
Разве при вызове конструктора/деструктора не вызываются конструкторы\деструкторы для встроенных типов?
Диструктор автоматически запускается при разрушении объекта (если верить книгам, это единственная причина, почему он вообще существует)

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

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

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

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

Добавлено через 1 минуту
те правильно f.~Foo();
но не то что вы написали, про конструкторы так совсем
0
LosAngeles
Заблокирован
13.11.2011, 16:32 #20
http://liveworkspace.org/code/d3ac41...f53834fd85d698
А vs2010 компилирует, странно... Порылся в стандарте и нигде не нашёл, что так можно или нельзя делать. В главе 12.6.1 Explicit initialization ничего подобного нет, а где ещё про это мб написано, поэтому смею предположить что это баг студии
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2011, 16:41 #21
я знаю единственный способ по стандарту собственно лично вызвать конструктор и это
C++
1
2
3
Foo f;
new(&f) Foo;
f.~Foo();
хотя вообще по сути тоже вызов конструктора по желанию
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
13.11.2011, 17:40  [ТС] #22
Цитата Сообщение от alex_x_x Посмотреть сообщение
те правильно f.~Foo();
но не то что вы написали, про конструкторы так совсем
В VS 2008 работает для деструкторов и .Foo::~Foo(); и .~Foo();
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2011, 17:43 #23
не верю (c)
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
13.11.2011, 17:45  [ТС] #24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Foo
{
    int a;
};
int main (void)
{
    Foo f;
    f.Foo::~Foo();
    f.Foo::~Foo();
    f.~Foo();
    f.~Foo();
    return(0);
}
Работает в VS 2008. Ошибок нет никаких.
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2011, 17:47 #25
Chelioss, да, но в этом примере я чтото уже не вижу f.Foo::Foo();
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2011, 17:48 #26
Цитата Сообщение от Chelioss Посмотреть сообщение
Работает в VS 2008. Ошибок нет никаких.
VS2010 тоже не выдает сообщей об ошибке

Цитата Сообщение от alex_x_x Посмотреть сообщение
да, но в этом примере я чтото уже не вижу f.Foo::Foo();
и с этим тоже нет ошибок
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
13.11.2011, 17:52  [ТС] #27
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo
{
    int a;
};
int main (void)
{
    Foo f;
    f.Foo::Foo();
    f.Foo::Foo();
    f.Foo::~Foo();
    f.Foo::~Foo();
    f.~Foo();
    f.~Foo();
    return(0);
}
Работает в VS2008. Ошибок нет.
Вот только вариант f.Foo(); не работает, а f.~Foo(); работает.
0
alkagolik
Заблокирован
13.11.2011, 18:38 #28
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo
{
        int a;
};
int main (void)
{
        Foo f;
        f.Foo::Foo();
        f.Foo::Foo();
        f.Foo::~Foo();
        f.Foo::~Foo();
        f.~Foo();
        f.~Foo();
        return(0);
}
gcc даже не компилирует.
main.cpp:10:16: ошибка: cannot call constructor «Foo::Foo» directly
main.cpp:11:16: ошибка: cannot call constructor «Foo::Foo» directly
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
13.11.2011, 19:31 #29
Цитата Сообщение от alkagolik Посмотреть сообщение
f.Foo::~Foo();
вот, нашел, что такую форму стандарт называет 5.2.4 "Pseudo destructor call"
для конструктора такой формы нету
думаю в студии сделано нестандартное расширения аля "Pseudo constructor call"

Добавлено через 7 минут
вот это тоже компилируется

C++
1
2
3
4
5
6
typedef int I;
 
int main() {
  I x = 10;
  x.I::~I();
}
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 19:31
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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