Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 12
1

Почему у массивов типа char может быть утечка памяти, а у указателей char с выделенной памятью - нет?

18.05.2019, 19:01. Просмотров 1783. Ответов 9
Метки нет (Все метки)

Тут будет утечка памяти:
C++
1
2
3
4
5
6
7
8
9
#include<iostream>
using namespace std;
int main()
{
    char name[1];
    cin >> name;
    cout << name;
    return 0;
}
А здесь нет:
C++
1
2
3
4
5
6
7
8
9
#include<iostream>
using namespace std;
int main()
{
    char *name = new char[1];
    cin >> name;
    cout << name;
    return 0;
}
Почему?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2019, 19:01
Ответы с готовыми решениями:

Почему у функции main() тип int? Почему не может быть какой-то другой, например, char?
Схема, касательно возвращаемого значения понятна. Не понятно почему именно целочисленное. Хелп)

Строки: почему компилятор пишет , что переменная типа char несовместима с const char?
char pass; int password( int d) { int m; char p; cout &lt;&lt; &quot;Введите пароль для доступа к...

В чем отличие двумерного массива типа char от массива указателей на char?
В чем отличие двумерного массива типа char и массива указателей на char ?

Почему в setnamedisc нужно использовать char * для установки значения, а при возвращении значения тип метода должен быть char* ?
Вопрос такой, почему в методе setnamedisc нужно использовать char *s для установки значения, а при...

9
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,168
Записей в блоге: 2
18.05.2019, 19:09 2
Чего?
0
47 / 46 / 2
Регистрация: 26.01.2014
Сообщений: 330
18.05.2019, 19:27 3
Во втором фрагменте Вы не освобождаете память, которую резервируете через ...new ... В остальном не вижу разницы. В чем будет выражаться утечка памяти?
Ваш - Etien
0
3528 / 1980 / 832
Регистрация: 07.02.2019
Сообщений: 5,305
18.05.2019, 19:32 4
Roman_Remeslo, вы в первом и во втором случае залезаете в чужую память, используйте istream::getline, istream::get или istream::read для безопасного чтения
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,168
Записей в блоге: 2
18.05.2019, 19:37 5
Почему у массивов типа char может быть утечка памяти, а у указателей char с выделенной памятью - нет?


Roman_Remeslo, после того, как ты ввел текст и нажал enter,
первая программа у тебя рухнула, поэтому ты решил, что в ней утечка памяти?
А вторая не рухнула, поэтому в ней нет утечки памяти?
1
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 12
18.05.2019, 19:45  [ТС] 6
Да, Croessmah.
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,168
Записей в блоге: 2
18.05.2019, 20:37 7
Лучший ответ Сообщение было отмечено Roman_Remeslo как решение

Решение

Roman_Remeslo, ты просто в первом коде вылез за пределы массива и переписал адрес возврата, который был расположен в стеке, поэтому код и упал.
Утечка как раз во втором коде - выделение памяти с помощью new[] есть, а освобождения с помощью delete[] нет.
А вот то что код не упал - это просто не повезло, ты тоже там пишешь за пределы выделенной памяти.
1
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 12
19.05.2019, 01:20  [ТС] 8
Когда скомпилировал в VS2010, то в первом вылезла ошибка, вот я и подумал, что это утечка памяти. Спасибо за пояснение, Croessmah.
0
47 / 46 / 2
Регистрация: 26.01.2014
Сообщений: 330
19.05.2019, 20:47 9
Транслятор крайне редко диагностирует ошибку наподобие Утечка памяти. Это ошибка выполнения. Она может быть, но в процессе работы вы просто не доходите до состояния, когда она проявляется. У самого бывали ошибки в программах, которые до того годами успешно работали. Очень поучительно разбираться.
Ваш - Etien
1
Комп_Оратор)
Эксперт по математике/физике
8467 / 4224 / 576
Регистрация: 04.12.2011
Сообщений: 12,611
Записей в блоге: 14
19.05.2019, 21:14 10
Roman_Remeslo, имя из одной буквы, это даже для собачки маловато. Напишите хотя бы:
Цитата Сообщение от Roman_Remeslo Посмотреть сообщение
char name[64];
Остап Сулейман Ибрагим Берта Мария Бендер-бей уже полностью поместится. Тогда останется утечка во втором случае где вы не освободили память и не передали указатель наружу, чтобы кто ни будь это сделал снаружи. То есть, память занята, а ключ от волшебной дверцы утерян. Тортилла не поможет теперь.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2019, 21:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Почему System.Char не может быть неявно преобразован к System.Int16?
Почему System.Char не может быть неявно преобразован к System.Int16? Почему только в его...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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