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

delete указателя

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

Студворк — интернет-сервис помощи студентам
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.08.2010, 13:55
Ответы с готовыми решениями:

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

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

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

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

Не по теме:

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

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

Не по теме:

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

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

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

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

Да нет, как раз таки в этом дело. Ты сначала открываешь доступ к переменным класса неизвестно кому, потом этот неизвестно кто (в данном случае объект класса String_value) удаляет переменную, на которую указывает value_pointer, хотя по логике владеть временем её жизни должен класс, которому она пренадлежит.... А потом удивляешься: чего это оно криво работает? Да потому что архитектура отвратная. Сейчас ты пофиксишь тут, а отвалится в другом месте.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
28.08.2010, 14:17
Цитата Сообщение от 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;
}
Результат такой:
Code
1
2
3
4
5
6
7
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  [ТС]
Цитата Сообщение от 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
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
28.08.2010, 14:56
Цитата Сообщение от norge_goth Посмотреть сообщение
даже так работает
Вы читать умеете?
Я же сказал, что в памяти может остаться некоторое значение, оно не обязательно будет затерто. При переносе кода на другую платформу все может измениться и тогда Ваш код рухнет при первой подобной операции.

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

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

Для int'a?
не тут конечно уже не буду так извращаться , тут обойдемся простым обнулением эт когда много надо будет чего удалить, хотя я встречал как некоторые делают свои ф-ции для освобождения и помещают их в заголовочный файл, а потом где надо просто подключают его
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2010, 15:13
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru