C/C++

Помогите с динамической памятью C++

Я так понял, когда мне нужно будет удалить переменную/массив я должен писать так для массива:
 int *nums = new int[5]; 
И так для переменной:
 int *num = new int; 
И у меня возникает 3 вопроса:
1) Можно ли создавать ссылку вместо указателя (для переменной)?
2) Почему бы это не делать для каждого массива и потом удалять его?
3) Почему если я напишу так:
 int *nums = new int[5]; 
то я смогу заполнить 6-ую ячейку массива?
1) Можно создать переменную-ссылку
int x = 5;
int &y = x;
2) Когда работаете со string, vector и т.д. если заглянуть под капот, так и происходит. Динамические объекты - это удобно, если всё сделано аккуратно, без утечек памяти.
3) Скорее всего выходите за пределы выделенной памяти. Компилятор может промолчать при этом, типа всё норм, но это небезопасное поведение программы.
Б(
Бахтияр (*
1 345
Лучший ответ
Асылжан Мырзахметов Спасибо за ответ, Максим. В 3 ответе, вы сказали, что это небезопасное поведение программы. Что может плохого произойти и почему компилятор (лично у меня Visual Studio 2022) молчит и даже компилирует это без ошибок ?
Асылжан Мырзахметов Большое спасибо, Максим, за то что понятно объяснили тему!
Бахтияр (* Пожалуйста!
Когда вы пишите
 int *nums = new int[5]; 
вы не удаляете переменную а создаете. Чтобы удалить массив надо будет потом написать что-то типа
 delete []nums; 
Когда вы выполняете new то получаете указатель на блок памяти а когда вы потом вызываете delete для удаления, этот указатель становится недействительным. Если, как вы пишите
 2) Почему бы это не делать для каждого массива и потом удалять его? 
то после создания ссылки (которая под капотом тот же самый указатель) а потом освобождения занимаемой памяти, на которую она ссылается, вы получите очень опасную ситуацию, когда ваша ссылка становится недействительной. Это очень плохо и хорошо, если программа при этом просто вылетит. Но возможна ситуация, когда у вас начнут втихаря портится данные, а вы поймете это только существенно позже.
Что касается вопроса
 то я смогу заполнить 6-ую ячейку массива? 
Смотрите: когда вы выделяете кусок памяти, вы, фактически, получаете указатель. Си считает, что вы разумный человек и не полезете за границу выделенного блока, но контроль этого лежит на вас. С одной стороны это хорошо, а с другой плохо. При этом в самом языке изначально НЕТ механизмов, которые бы запрещали вам обращаться куда угодно. Учитывая потенциальную опасность подобных действий, большая часть языков, появившихся после Си, пытались как-то обезопасить работу с памятью и устраивали гонения на указатели, дабы хоть как-то оградить нерадивых программистов от самих себя.
Олег Адов
Олег Адов
9 624