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

Выделение динамической памяти указателю в локальной функции - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
19.05.2011, 00:05     Выделение динамической памяти указателю в локальной функции #1
Собственно, я не до конца понимаю, что происходит, поэтому прошу если кто может как можно доходчивее пояснить. Упрощенная версия кода приблизительно такая:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
void Initialize(char * cptr)
{
  cptr = new char[100];
}
 
void main()
{
  char * ptr;
  Initialize(ptr);
  printf(ptr);//если в этой строчке что не так выбачайте, суть в том, что мы используем потом этот указатель
}
Программа вываливается во время выполнения с ошибкой. Я знаю, что после выполнения функции все переменные, обьявленые в ней удаляются, а если были изменения с переменными-параметрами, то при передачи по значению изменения производятся с локальной копией, поэтому не затрагивают оригинальные переменные. Но тут передается указатель, то есть передача же не по значение, а по указателю, то есть изменения над этой переменой производятся не над копией, а над этим же указателем. Мы выделяем указателю память и устанавливаем его на начало этого сегмента памяти.
Но программа вываливается в рантайме, значит указатель указывает в непонятно что. Что, при выходе из локальной памяти на все new в не' делается delete? Или создается копия указателя, и память выделяется ему, но оригинальный указатель разве на будет указывать на эту же память, даже если в функции создалася его локальная копия? Не совсем понимаю этот момент, поясните, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2011, 00:05     Выделение динамической памяти указателю в локальной функции
Посмотрите здесь:

Выделение динамической памяти в функции C++
C++ Выделение динамической памяти
C++ динамическое выделение памяти указателю
Выделение динамической памяти C++ C++
C++ выделение динамической памяти
Выделение динамической памяти C++
Выделение динамической памяти C++
Выделение динамической памяти размером полученным из функции C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
19.05.2011, 00:16     Выделение динамической памяти указателю в локальной функции #2
Всё дело в том, что когда мы передаём переменную в функцию по указателю, мы собираемся менять значение переменной. Поменять указатель мы не сможем (поскольку в данном случае локальным параметром буде являться указатель). А при выделении памяти нам необходимо изменить именно указатель. У вас же получается, что меняете вы всё-таки локальную переменную, т.е. указатель на тип int. Чтобы сделать то, что вы хотите, следует передавать указатель на указатель (чтобы изменить не значение по указателю, а указатель по указателю), т.е. так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
void my_alloc(char **memory)
{
    *memory = new char [100];
}
 
int main()
{
    char *ptr;
 
    my_alloc(&ptr);
 
    // Работа с памятью
 
    delete [] ptr;
 
    return 0;
}
Чтобы скрыть подробности (не брать адрес указателя лишний раз), можно с тем же успехом использовать ссылки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
void my_alloc(char *&memory)
{
    memory = new char [100];
}
 
int main()
{
    char *ptr;
 
    my_alloc(ptr); // Больше не надо писать &ptr
 
    // Работа с памятью
 
    delete [] ptr;
 
    return 0;
}
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
19.05.2011, 00:28  [ТС]     Выделение динамической памяти указателю в локальной функции #3
Спасибо большое!
Yandex
Объявления
19.05.2011, 00:28     Выделение динамической памяти указателю в локальной функции
Ответ Создать тему
Опции темы

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