Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
1

delete указателя

28.08.2010, 13:55. Показов 1456. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
valueOfWordS - указатель, член класса String_value, конструктору же этого класса передается указатель на переменную того же типа:

C++
1
2
3
4
5
6
String_value::String_value(int* value_pointer)
{
    valueOfWordS = 0;
    valueOfWordS = value_pointer;
    delete value_pointer;
}
Вопрос, почему когда освобождается память
C++
1
 delete value_pointer;
вне конструктора например в ф-циях можно всеравно обращаться к указателю valueOfWordS, ведь память должна была затереться так как valueOfWordS = value_pointer; используют одну и ту же область памяти?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2010, 13:55
Ответы с готовыми решениями:

Вызов delete для нулевого указателя
Здравствуйте. Прочитал про конструктор переноса, в котором при копировании, необходимо обнулить все...

Удалит ли delete[] после измения типа указателя
... double *pd = new double; char *pc = (char*)pd; delete pc; ... Меня интерисует что...

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю, что будет если...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя?
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс)...

12
Заблокирован
28.08.2010, 13:59 2
Тебе не кажется, что передавать int через указатель немного странно?

Не по теме:

Я так полагаю, что передаётся именно указатель на одно число, а не на массив, ибо в том случае глупо бы было делать delete вместо delete[].

0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
28.08.2010, 14:05 3
Цитата Сообщение от norge_goth Посмотреть сообщение
вне конструктора например в ф-циях можно всеравно обращаться к указателю valueOfWordS, ведь память должна была затереться так как valueOfWordS = value_pointer; используют одну и ту же область памяти?
Куда же память то денется. Максимум, что затрется, так это значения по этому адресу в памяти. Запрещено обращаться только к нулевым указателям.
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
28.08.2010, 14:05  [ТС] 4
Цитата Сообщение от NightmareZ Посмотреть сообщение
Тебе не кажется, что передавать int через указатель немного странно?

Не по теме:

Я так полагаю, что передаётся именно указатель на одно число, а не на массив, ибо в том случае глупо бы было делать delete вместо delete[].

там странного ничего нет, объект создается внутри другого объекта, а именно при нажатии кнопки "Run"(это гуи приложение), а указатель нужен для того чтобы при некоторых условиях узменить значение переменной из первого класса(который вызывает констуктор String_value - класса)
0
Заблокирован
28.08.2010, 14:07 5
Цитата Сообщение от norge_goth Посмотреть сообщение
там странного ничего нет, объект создается внутри другого объекта, а именно при нажатии кнопки "Run"(это гуи приложение), а указатель нужен для того чтобы при некоторых условиях узменить значение переменной из первого класса(который вызывает констуктор String_value - класса)

Ну тогда это нарушение инкапсуляции.
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
28.08.2010, 14:10  [ТС] 6
Цитата Сообщение от fasked Посмотреть сообщение
Куда же память то денется. Максимум, что затрется, так это значения по этому адресу в памяти. Запрещено обращаться только к нулевым указателям.
так дело и в том *valueOfWordS значением можно свободно пользоваться в классе после конструктора

Добавлено через 2 минуты
Цитата Сообщение от NightmareZ Посмотреть сообщение
Ну тогда это нарушение инкапсуляции.
Может и так, но это осознанная жертва, хотя если посидеть это можно исправить
но дело в другом, дело в сути вопроса
0
Заблокирован
28.08.2010, 14:14 7
Цитата Сообщение от norge_goth Посмотреть сообщение
Может и так, но это осознанная жертва, хотя если посидеть это можно исправить
но дело в другом, дело в сути вопроса

Да нет, как раз таки в этом дело. Ты сначала открываешь доступ к переменным класса неизвестно кому, потом этот неизвестно кто (в данном случае объект класса String_value) удаляет переменную, на которую указывает value_pointer, хотя по логике владеть временем её жизни должен класс, которому она пренадлежит.... А потом удивляешься: чего это оно криво работает? Да потому что архитектура отвратная. Сейчас ты пофиксишь тут, а отвалится в другом месте.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
28.08.2010, 14:17 8
Цитата Сообщение от norge_goth Посмотреть сообщение
так дело и в том *valueOfWordS значением можно свободно пользоваться в классе после конструктора
Смотрите, как я понял у Вас примерно такой случай:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    int *p1 = new int;
    int *p2 = p1;
 
    *p1 = 5;
 
    std::cout << "P1: " << *p1 << std::endl
              << "P2: " << *p2 << std::endl;
 
    delete p1;
 
    std::cout << "P1: " << *p1 << std::endl
              << "P2: " << *p2 << std::endl;
}
Результат такой:
Код
fasked@linux-5kgr:~/Documents> g++ test.cpp
fasked@linux-5kgr:~/Documents> ./a.out
P1: 5
P2: 5
P1: 0
P2: 0
fasked@linux-5kgr:~/Documents>
Но! Значение в памяти не обязательно затрется! Там может остаться мусор, это нормально. В любом случае пользоваться дальше указателем p2 неправильно! Это может привести к трудноуловимым ошибкам.
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
28.08.2010, 14:39  [ТС] 9
Цитата Сообщение от NightmareZ Посмотреть сообщение
Да нет, как раз таки в этом дело. Ты сначала открываешь доступ к переменным класса неизвестно кому, потом этот неизвестно кто (в данном случае объект класса String_value) удаляет переменную, на которую указывает value_pointer, хотя по логике владеть временем её жизни должен класс, которому она пренадлежит.... А потом удивляешься: чего это оно криво работает? Да потому что архитектура отвратная. Сейчас ты пофиксишь тут, а отвалится в другом месте.
Открыл доступ только в одном месте, а именно указателю, дело как раз в том что она криво не работает хотя должна

Добавлено через 20 минут
Цитата Сообщение от fasked Посмотреть сообщение

Но! Значение в памяти не обязательно затрется! Там может остаться мусор, это нормально. В любом случае пользоваться дальше указателем p2 неправильно! Это может привести к трудноуловимым ошибкам.
даже так работает
C++
1
2
3
4
5
6
7
8
9
String_value::String_value(int* value_pointer)
{
    delete value_pointer;
    valueOfWordS = 0;
    valueOfWordS = value_pointer;
    std::cout << *valueOfWordS << endl;
 
    std::cout << "!!!!" << *value_pointer << endl;
}
в конструктор с внешнего класса передается адрес переменной со значением 3, в конструкторе делаю вывод *valueOfWordS и *value_pointer после delete и тоже получаю 3!
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
28.08.2010, 14:56 10
Цитата Сообщение от norge_goth Посмотреть сообщение
даже так работает
Вы читать умеете?
Я же сказал, что в памяти может остаться некоторое значение, оно не обязательно будет затерто. При переносе кода на другую платформу все может измениться и тогда Ваш код рухнет при первой подобной операции.

Хорошей привычкой считается после операций освобождения памяти обнулять указатели
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
28.08.2010, 15:02  [ТС] 11
Цитата Сообщение от fasked Посмотреть сообщение
Вы читать умеете?
Я же сказал, что в памяти может остаться некоторое значение, оно не обязательно будет затерто. При переносе кода на другую платформу все может измениться и тогда Ваш код рухнет при первой подобной операции.

Хорошей привычкой считается после операций освобождения памяти обнулять указатели
все теперь понятно, после обнуления указателя программа рухнула, будем теперь знать что платформа тоже вносит свои коррективы, теперь буду постоянно их обнулять, наверно даже ф-цию напишу для автоматизма или delete перегружу
Спасибо
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
28.08.2010, 15:06 12
Цитата Сообщение от norge_goth Посмотреть сообщение
наверно даже ф-цию напишу для автоматизма
Это уже перебор по-моему.
Цитата Сообщение от norge_goth Посмотреть сообщение
или delete перегружу
Для int'a?
0
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
28.08.2010, 15:13  [ТС] 13
Цитата Сообщение от fasked Посмотреть сообщение
Это уже перебор по-моему.

Для int'a?
не тут конечно уже не буду так извращаться , тут обойдемся простым обнулением эт когда много надо будет чего удалить, хотя я встречал как некоторые делают свои ф-ции для освобождения и помещают их в заголовочный файл, а потом где надо просто подключают его
0
28.08.2010, 15:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2010, 15:13
Помогаю со студенческими работами здесь

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B* b = nullptr; }; ...

Преобразование кода без указателя в код с использованием указателя
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt;...

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод....

В чем разница между delete и delete[]?
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru