Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410

Почему указатель теряет свои значения после выхода с метода, память выделена динамически

24.10.2016, 17:56. Показов 6153. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
using namespace std;
 
void sqr( int* a, int length );
 
int main() {
    int *a = new int[3];
    int length = 3;
    for (int i = 0; i < length; i++)
        a[i] = i*i + 1;
    sqr( a, length );
    for (int i = 0; i < length; i++)
        cout << a[i] << " ";
}
 
void sqr(int* a, int length) {
    int *b = new int[length];
    for (int i = 0; i < length; i++)
        b[i] = a[i] * a[i];
    delete [] a;
    a = new int[length];
    for (int i = 0; i < length; i++)
        a[i] = b[i];
    delete[] b;
}
После выполнения функции sqr значение указателя a вроде должно было остаться но после выхода с метода он указывает на мусор хотя память указателя а была очищена перед выделением памяти и потом скопированы значения указателя b и память указателя b очищена. Этот код лишь для примера, не надо комментариев типа зачем тебе указатель b или зачем функция sqr. Мне просто интересно почему указатель после выхода с функции указывает на мусор.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.10.2016, 17:56
Ответы с готовыми решениями:

Ввод значения в переменную типа string, память под которую выделена динамически
Ребят, подскажите пожалуйста, как организовать ввод значения в переменную типа string, память под которую выделена динамически? ...

Проверка выделена ли память под указатель
Уважаемые программисты!!!!! подскажите пожалуйста можно ли каким-либо способом проверить в условном операторе, выделена ли память под...

По каким причинам память не может быть выделена динамически?
Что это могут быть за причины?

33
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
24.10.2016, 19:20  [ТС]
Студворк — интернет-сервис помощи студентам
та с ссылками у меня всё хорошо(по крайней мере в шарпе) я понимаю как они работают. просто там они могут быть переданы по ссылке и по значению. а указатели я ещё ни разу не передавал по ссылке и не знал что так можно делать.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Bar(const Bar & b):a(b.a){cout<<"copy ctor"<<endl;};
};
и этот конструктор же необязателен потому что в структуре нет динамического распределения памяти.
Спасибо за время потраченное на меня).
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
24.10.2016, 19:41
Цитата Сообщение от IchimaruGin Посмотреть сообщение
а указатели я ещё ни разу не передавал по ссылке и не знал что так можно делать.
Указатель - в этом отношении такая же точно переменная, как и остальные. Вот, например, int ты можешь передать по ссылке. int * - ничем не хуже.

А вообще, звездочка эта вас (новичков) прям в транс какой-то вводит, сразу понимать перестаете Не первый раз замечаю.
Ну написать хоть так, тогда:
C++
1
typedef int * int_ptr_t;
может тогда запись вроде этой перестанет быть чем-то исключительным
C++
1
void foo(int_ptr_t & ptrRef); // void foo(int * & ptrRef)
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.10.2016, 19:43
Цитата Сообщение от IchimaruGin Посмотреть сообщение
и этот конструктор же необязателен потому что в структуре нет динамического распределения памяти.
Он нужен чтобы запустив код увидеть, что ссылка переданная в функцию ожидающую значение поведёт себя так же как и простая переменная. Вы увидите сообщение из конструктора копии. Внутреннюю переменную в этом случае уже необходимо инициализировать, потому как:
Цитата Сообщение от IchimaruGin Посмотреть сообщение
конструктор же необязателен
если он вообще не определён. Иначе - плохо.
Шарп не плюсы.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
24.10.2016, 20:18  [ТС]
DrOffset, та у меня просто раньше надобности не было передавать указатели по ссылке до сего дня(на самом деле до позавчерашнего дня, но так лучше звучит) а указатели я тоже понимаю просто про эту особенность не знал)

Добавлено через 9 минут
и кстати сслыка на значение это тоже точно такая же переменная как указатель но передавать по ссылке в метод не разрешается
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
24.10.2016, 20:22
Цитата Сообщение от IchimaruGin Посмотреть сообщение
а указатели я тоже понимаю просто про эту особенность не знал)
Это не особенность указателей, про что DrOffset и пишет:
Цитата Сообщение от DrOffset Посмотреть сообщение
Указатель - в этом отношении такая же точно переменная, как и остальные.
Получается, что ты не знал разницы между передачей переменных в функцию по ссылке и по значению. Или:
Цитата Сообщение от DrOffset Посмотреть сообщение
звездочка эта вас (новичков) прям в транс какой-то вводит, сразу понимать перестаете
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
24.10.2016, 20:30  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Получается, что ты не знал разницы между передачей переменных в функцию по ссылке и по значению.
но ведь если я не знал что указатели передаются по ссылке(или что ссылки не передаются по ссылке) не значит что я немог(или не знал как) int или double передать по ссылке... Это скорее исключение из правила про передачу аргументов методу по ссылке... И разве неправильно будет сказать что возможность передачи указателя по ссылке методу это особенность указателя?(хотя да несовсем коректно но процентов на 80% мне кажется правильно)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
24.10.2016, 20:43
Цитата Сообщение от IchimaruGin Посмотреть сообщение
И разве неправильно будет сказать что возможность передачи указателя по ссылке методу это особенность указателя?
Конечно неправильно, потому что:
Цитата Сообщение от DrOffset Посмотреть сообщение
Указатель - в этом отношении такая же точно переменная, как и остальные.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.10.2016, 22:58
Цитата Сообщение от IchimaruGin Посмотреть сообщение
. И разве неправильно будет сказать что возможность передачи указателя по ссылке методу это особенность указателя?
Указатель это переменная для хранения адреса. В этом смысле он совершенно равноправен с другими переменными. Ссылка на него выглядит "мордато". Декорирована звездочками, аксельбантами, галунами... Это устрашает сначала.
В C# есть передача по ссылке для значений. Этот язык защищается от неинициализированной ссылки натравливая компилятор, всякий раз когда есть двусмысленность. Но если Вы показываете, что делаете это намеренно, - декорировав переменную как out то все тихо и спокойно. Случай с указателем в Вашей теме, это именно такой случай. Если бы переменная была инициализирована перед вызовом (массивом или одиночным объектом), то копирование переменной не стало бы проблемой для случая когда в функции нет изменения адреса. Можно было бы поработать с той памятью и выйти. Но если нужно установить указатель на новую память, то нужно избежать копирования. Это можно сделать указателем на указатель или ссылкой на указатель. Мне кажется, что Вы не поняли, зачем конструктор с сообщением cout<<"copy ctor"<<endl; именно потому, что не придаёте тому, что услышали нужного значения.
Что до того, что Вы зря освобождаете память и выделяете снова в функции, то это отдельный разговор. Вполне можно было бы работать с памятью которая выделена перед вызовом. И не нужна тогда ссылка на указатель.
Разница между инициализированным указателем и неинициализированным указателем, таже что и при передаче ref и out в данном случае.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
24.10.2016, 23:54  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вполне можно было бы работать с памятью которая выделена перед вызовом.
дело в том что мне в "моей" задаче нужно было по массиву элементов создать другой массив большего размера, несколько раз...
В итоге я сделал ту задачу с помощью вектора, но мне не давал покоя вопрос почему я не мог реализовать функцию через указатели, почему терялась память указателя. Но теперь понял.

Добавлено через 10 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
И разве неправильно будет сказать что возможность передачи указателя по ссылке методу это особенность указателя?
Тут я действительно погорячился, тут больше подходит слово свойство а не особенность...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.10.2016, 23:59
Цитата Сообщение от IchimaruGin Посмотреть сообщение
дело в том что мне в "моей" задаче нужно было по массиву элементов создать другой массив большего размера, несколько раз...
Нужно было показать это в примере. Не было бы двусмысленности. Вообще из всего кода имело бы смысл оставить объявление указателя (без выделения памяти и пр. телодвижений) и передачу в функцию, где выделяется память (не обязательно под аж целый массив) и инициализируется значением вроде того что: a = new int(12345); и попытаться распечатать переданный разыменованный указатель после вызова. Тогда вопрос был бы более понятен.
Цитата Сообщение от IchimaruGin Посмотреть сообщение
Но теперь понял.
Это главное.

Добавлено через 4 минуты
Цитата Сообщение от IchimaruGin Посмотреть сообщение
тут больше подходит слово свойство
Не подходит. Подходит:
Цитата Сообщение от IchimaruGin Посмотреть сообщение
я действительно погорячился
Перечитайте. int - тип, а int & - ссылка на тип int . Указатель на целое это тип int *, а ссылка на этот тип - ссылка на указатель на целое: int * & особенность в том, что нет особенностей.
1
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
25.10.2016, 00:07  [ТС]
IGPIGP, а ты хорош) я раньше думал что ссылка на тип это тоже тип(ну по крайней мере в C# это так), я такого поворота не ожидал))
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.10.2016, 00:47
Цитата Сообщение от IchimaruGin Посмотреть сообщение
хорош
Если бы. Но всё равно спасибо.
Цитата Сообщение от IchimaruGin Посмотреть сообщение
я раньше думал что ссылка на тип это тоже тип(ну по крайней мере в C# это так
Я вначале думал так же. Да и сейчас мне кажется, что то что ссылка это тип это не логично. И случалось я спорил, доказывая (пытаясь), что ссылка это не тип. Это сущность которая не имеет объекта и, следовательно, всех "классических" атрибутов типа: размер, формат, набор допустимых значений и набор операций над значениями. Но факт остаётся фактом. Ссылка в C++, это тип. С кучей исключений из общих правил. Главное различие в том, что в отличие от "нормальных" типов, она не имеет объекта сама по себе. Её объект - объект типа, на который она ссылается. Поэтому все операции над собой она переадресовывает этому объекту. Sizeof() например. Из-за этого, в частности, ссылка не может быть объявлена как переменная, а потом присвоена. То есть в 2-х инструкциях. Она может быть только объявлена и инициализирована сразу. Это не позволяет создавать массивы ссылок, например. В C# можно объявить ссылку в одной инструкции а присвоить в другой. Как и любой тип. Так что ссылки в C++ считаются типом, всё-таки.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
25.10.2016, 01:36  [ТС]
да блин, я все-таки прав...)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
25.10.2016, 06:00
Цитата Сообщение от IchimaruGin Посмотреть сообщение
И разве неправильно будет сказать что возможность передачи указателя по ссылке методу это особенность указателя?
Неправильно. В данном случае мы наблюдаем полное отсутствие какой-либо особенности. Указатель - такая же переменная, как и любая другая переменная.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2016, 06:00

Windows 10 теряет сеть WiFi после выхода из сна
Доброго времени суток! Ноут обновился с Win7 до Win10, теперь при уходе в сон и затем пробуждении теряется подключение к wifi: идёт...

указатель не меняется после выхода из ф-ции
void changePionter(char *p) { p=NULL; } int main() { char u='F'; char *p= &amp;u; changePionter(p); // *p=='F'; // a надо...

Разделяемая память POSIX IPC как узнать, что память выделена и её уже можо использовать?
1. Описание проблемы: Две программы. Одна пишет в разделяемую память, другая читает. Из-под читающей программы read невозможно понять...

Выделить под массив динамически память. Обращаться к элементам массива необходимо используя указатель
/*В одномерном массиве, состоящем из n вещественных элементов, вычислить: - количество элементов массива, лежащих в диапазоне от А до В; ...

Выделить под массив динамически память. Обращаться к элементам массива необходимо используя указатель
/*Проверить, все ли строки матрицы содержат хотя бы один отрицательный элемент Если да, то изменить знаки всех элементов матрицы на...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru