Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
mikl
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 8
#1

Объявление объекта внутри функции - C++

07.06.2012, 03:06. Просмотров 587. Ответов 6
Метки нет (Все метки)

Здраствуйте. У меня такой вопрос:
есть класс

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
{
    public:
        A(): p1(p2),p2(new int)
        {
    
        }
        void f_free()
        {
            delete p1;
        }
    private:
        int* p1;
        int* p2;
};
Почему при таком вызове
C++
1
2
3
4
5
6
A a1;
 
void f1()
{
    a1.f_free();
}
приложение работает, а при таком

C++
1
2
3
4
5
void f1()
{
    A a1;
    a1.f_free();
}
падает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2012, 03:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Объявление объекта внутри функции (C++):

Объявление класса, создание объекта и вызов функции-члена
Всем добрый день! Вот так я объявляю класс. typedef map<string, double>...

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

Объявление переменной внутри цикла while
Доброго времени суток, форумчане. Расскажите нубу, что происходит при...

Объявление статического объекта
Объясните пожалуйста как правильно объявить статический объект. У меня в кейсе...

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

Объявление объекта класса
Доброе время суток! Дело вот в чем: В конструкторе c параметрами класса...

6
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
07.06.2012, 03:36 #2
когда a1, объявлена как глобальная, все поля автоматически инициализируются нулями (p1 указывает на 0), а очищение памяти по нулевому указателю разрешается.

при локальном объявлении такого не происходит.
0
mikl
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 8
07.06.2012, 14:05  [ТС] #3
Большое спасибо
0
w@
11 / 11 / 5
Регистрация: 11.04.2012
Сообщений: 28
16.06.2012, 13:23 #4
ответ не правильный, возможно правильный, но не тот случай.
C++
1
2
3
4
5
void f1()
{
    A a1;
    a1.f_free();
}
на самом деле работает, а не работает
C++
1
2
3
4
5
6
A a1;
void f1()
{
    A a2;
    a2.f_free();
}
почему?
0
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
16.06.2012, 14:52 #5
w@, так вы объясните - почему?

Добавлено через 34 секунды
я уж не говорю о том что приведенные выше коды не различаются
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
16.06.2012, 15:19 #6
Нельзя полагаться на автоматическую очистку указателя, особенно завернутого в класс: не известно, что валялось в памяти там, где создан сам указатель и существует стандарт, по которому любая переменная при объявлении сохраняет этот мусор и хотя плюсы от этого ушли, но совсем не так:
Цитата Сообщение от OstapBender Посмотреть сообщение
когда a1, объявлена как глобальная, все поля автоматически инициализируются нулями
, а так: за стартовое значение любого объекта отвечает конструктор его класса, если ни один конструктор не прописан, то контсруктор без параметров создаётся неявно и автоматически и в нём кодируется автоматическое обнуление всех указателей и всех скалярных полей, а поля-объекты инициируются конструкторами своих объектов. Это приводит к тому, что правила инициализации могут плавать от типа к типу, особенно если эти типы - классы и такое поведение компилятора усугубляется ещё и наследованием. Поэтому если у тебя есть указатель и ты не уверен в его инициализации конструктором предка, то инициируй сам. Мало ли, может предок вообще не имеет подходящего конструктора.
0
w@
11 / 11 / 5
Регистрация: 11.04.2012
Сообщений: 28
16.06.2012, 16:06 #7
OstapBender, так я и сам не знаю, хочу понять
0
16.06.2012, 16:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2012, 16:06
Привет! Вот еще темы с решениями:

Объявление переменных внутри блока switch
#include <iostream> int main() { int choice = 2; ...

Ругань на объявление массива внутри класса
Задание: создать класс-контейнер, реализующий политику FIFO. Имею код: ...

Объявление объекта вложенного класса
Есть структура наподобие: template<class T> class A{ //...... public:...

Объявление в классе объекта другого класса
какая-то фигня получается, допустим есть 2 класса - class1 и class2, в хедерах...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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