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

delete указателя - C++

Восстановить пароль Регистрация
 
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
28.08.2010, 13:55     delete указателя #1
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; используют одну и ту же область памяти?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
28.08.2010, 13:59     delete указателя #2
Тебе не кажется, что передавать int через указатель немного странно?

Не по теме:

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

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

Не по теме:

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

там странного ничего нет, объект создается внутри другого объекта, а именно при нажатии кнопки "Run"(это гуи приложение), а указатель нужен для того чтобы при некоторых условиях узменить значение переменной из первого класса(который вызывает констуктор String_value - класса)
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
28.08.2010, 14:07     delete указателя #5
Цитата Сообщение от norge_goth Посмотреть сообщение
там странного ничего нет, объект создается внутри другого объекта, а именно при нажатии кнопки "Run"(это гуи приложение), а указатель нужен для того чтобы при некоторых условиях узменить значение переменной из первого класса(который вызывает констуктор String_value - класса)

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

Добавлено через 2 минуты
Цитата Сообщение от NightmareZ Посмотреть сообщение
Ну тогда это нарушение инкапсуляции.
Может и так, но это осознанная жертва, хотя если посидеть это можно исправить
но дело в другом, дело в сути вопроса
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
28.08.2010, 14:14     delete указателя #7
Цитата Сообщение от norge_goth Посмотреть сообщение
Может и так, но это осознанная жертва, хотя если посидеть это можно исправить
но дело в другом, дело в сути вопроса

Да нет, как раз таки в этом дело. Ты сначала открываешь доступ к переменным класса неизвестно кому, потом этот неизвестно кто (в данном случае объект класса String_value) удаляет переменную, на которую указывает value_pointer, хотя по логике владеть временем её жизни должен класс, которому она пренадлежит.... А потом удивляешься: чего это оно криво работает? Да потому что архитектура отвратная. Сейчас ты пофиксишь тут, а отвалится в другом месте.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
28.08.2010, 14:17     delete указателя #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 неправильно! Это может привести к трудноуловимым ошибкам.
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
28.08.2010, 14:39  [ТС]     delete указателя #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!
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
28.08.2010, 14:56     delete указателя #10
Цитата Сообщение от norge_goth Посмотреть сообщение
даже так работает
Вы читать умеете?
Я же сказал, что в памяти может остаться некоторое значение, оно не обязательно будет затерто. При переносе кода на другую платформу все может измениться и тогда Ваш код рухнет при первой подобной операции.

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

Хорошей привычкой считается после операций освобождения памяти обнулять указатели
все теперь понятно, после обнуления указателя программа рухнула, будем теперь знать что платформа тоже вносит свои коррективы, теперь буду постоянно их обнулять, наверно даже ф-цию напишу для автоматизма или delete перегружу
Спасибо
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
28.08.2010, 15:06     delete указателя #12
Цитата Сообщение от norge_goth Посмотреть сообщение
наверно даже ф-цию напишу для автоматизма
Это уже перебор по-моему.
Цитата Сообщение от norge_goth Посмотреть сообщение
или delete перегружу
Для int'a?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2010, 15:13     delete указателя
Еще ссылки по теме:

delete[] *pointer vs. delete pointer и утечка памяти C++
New delete C++

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

Или воспользуйтесь поиском по форуму:
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
28.08.2010, 15:13  [ТС]     delete указателя #13
Цитата Сообщение от fasked Посмотреть сообщение
Это уже перебор по-моему.

Для int'a?
не тут конечно уже не буду так извращаться , тут обойдемся простым обнулением эт когда много надо будет чего удалить, хотя я встречал как некоторые делают свои ф-ции для освобождения и помещают их в заголовочный файл, а потом где надо просто подключают его
Yandex
Объявления
28.08.2010, 15:13     delete указателя
Ответ Создать тему
Опции темы

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