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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
#1

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

28.08.2010, 13:55. Просмотров 849. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2010, 13:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос delete указателя (C++):

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

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

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

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include <iostream> #include <cstdlib> #include <fstream> using namespace...

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

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NightmareZ
1340 / 563 / 37
Регистрация: 31.03.2009
Сообщений: 1,919
28.08.2010, 13:59 #2
Тебе не кажется, что передавать int через указатель немного странно?

Не по теме:

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

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

Не по теме:

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

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

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

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

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

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

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

Для int'a?
не тут конечно уже не буду так извращаться , тут обойдемся простым обнулением эт когда много надо будет чего удалить, хотя я встречал как некоторые делают свои ф-ции для освобождения и помещают их в заголовочный файл, а потом где надо просто подключают его
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2010, 15:13
Привет! Вот еще темы с ответами:

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

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.08.2010, 15:13
Ответ Создать тему
Опции темы

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