Форум программистов, компьютерный форум 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++ Конструкторы и деструкторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.11.2011, 16:41     Дин. выделение памяти, конструкторы/деструкторы #21
я знаю единственный способ по стандарту собственно лично вызвать конструктор и это
C++
1
2
3
Foo f;
new(&f) Foo;
f.~Foo();
хотя вообще по сути тоже вызов конструктора по желанию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.11.2011, 17:40  [ТС]     Дин. выделение памяти, конструкторы/деструкторы #22
Цитата Сообщение от alex_x_x Посмотреть сообщение
те правильно f.~Foo();
но не то что вы написали, про конструкторы так совсем
В VS 2008 работает для деструкторов и .Foo::~Foo(); и .~Foo();
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.11.2011, 17:43     Дин. выделение памяти, конструкторы/деструкторы #23
не верю (c)
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
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. Ошибок нет никаких.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.11.2011, 17:47     Дин. выделение памяти, конструкторы/деструкторы #25
Chelioss, да, но в этом примере я чтото уже не вижу f.Foo::Foo();
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2011, 17:48     Дин. выделение памяти, конструкторы/деструкторы #26
Цитата Сообщение от Chelioss Посмотреть сообщение
Работает в VS 2008. Ошибок нет никаких.
VS2010 тоже не выдает сообщей об ошибке

Цитата Сообщение от alex_x_x Посмотреть сообщение
да, но в этом примере я чтото уже не вижу f.Foo::Foo();
и с этим тоже нет ошибок
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
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(); работает.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 19:31     Дин. выделение памяти, конструкторы/деструкторы
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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();
}
Yandex
Объявления
13.11.2011, 19:31     Дин. выделение памяти, конструкторы/деструкторы
Ответ Создать тему
Опции темы

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