Удаление указателей
Вот код, на строке delete p; программа падает и, если честно, не понимаю почему. Вроде читала про указатели, и вроде ж всё правильно делаю.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе.
Удаление указателей на C++
#include <iostream> using namespace std; class Induct < public: void Set(int a) .
удаление указателей
Я создал указатель и выделил память vector < vector <Obj> > *p_L = new vector< vector <Obj> >;.
Применение и удаление указателей
Здравствуйте. Я не могу понять сути,когда нам нужно удалить указатель для освобождения памяти.
Регистрация: 09.01.2019
Сообщений: 13
Окно эксепшна
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
Сообщение от Alice_404
на строке delete p; программа падает
а что вы пытаетесь удалить? Не красиво удалять то, чего вы сами не создавали.
Регистрация: 09.01.2019
Сообщений: 13
Сообщение от Azazel-San
а что вы пытаетесь удалить? Не красиво удалять то, чего вы сами не создавали.
Вы имеете в виду не использовала new?
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
Сообщение от Alice_404
Вы имеете в виду создавала без new?
Если упростить, то да.
98 / 64 / 36
Регистрация: 14.10.2018
Сообщений: 152
Нужно динамически создать переменную(с помощью new), чтобы управлять ее сроком жизни. А вы пытаетесь удалить локальную переменную, которая автоматически будет удалена при выходе из зоны видимости.
Для самостоятельного управления сроком жизни используйте
int *a = new int(10);
. Но учтите, что a является указателем и работать с ним нужно соответствующе, а также не забывать освобождать память с помощью delete и следить за валидностью указателя.
Регистрация: 09.01.2019
Сообщений: 13
Azazel-San, JAlHund, то есть, лучше тогда создать указатель, выделить под него память и засетить ему а. Хорошо, тут поняла, спасибо!
Но ещё вопросик один. А как хранить указатель? Я тут пробовала р2 = р, но если удалить р, то в р2, если разыменовать, уже мусор. Можно как-то удалить р, чтобы сохранилось значение в р2? Спасибо!
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
Сообщение от Alice_404
лучше тогда создать указатель, выделить под него память и засетить ему а
а кто говорил что это лучше?
Сообщение от Alice_404
А как хранить указатель?
Да как угодно.
Сообщение от Alice_404
но если удалить р, то в р2, если разыменовать, уже мусор
Все логично.
Сообщение от Alice_404
Можно как-то удалить р, чтобы сохранилось значение в р2?
Можно но тогда р2 будет не указателем.
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
Принцип простой: если вы делали new, то где-то должен быть delete. Если new не делали, то и delete не нужен.
98 / 64 / 36
Регистрация: 14.10.2018
Сообщений: 152
Если вы освобождаете память(delete), то все указатели на эту область памяти становятся невалидные(указывают на мусор). p2 и p указывают на одну и тоже область памяти, если один из них освобождает память, то там мусор и другой указатель будет указывать на эту же область памяти(мусор). Все логично. Если вам нужно сохранить данные, копируете их в другую зарезервированных область памяти. Или вы имеете ввиду выход указателя из зоны видимости? Тогда значение так и останется и память не освобождается.
1 2 3 4 5 6 7 8 9 10 11 12 13
#include int main() { int *a = new int(10); std::cout*a; do { int *p = a; // Указатель существует только в этом блоке std::cout*pstd::endl; } while(false); std::cout*astd::endl; //Значение не изменилось, мусор не появился, т.к. delete автоматически не вызывается delete a; return 0; }
Как очистить указатель — C++?
Дан указатель
double **p = 0;
Выполните следующие задания (решения можно оформлять внутри функции main).
Создайте конструкцию, изображенную на рисунке.
Выведите число в квадратике на экран. После этого удалите все динамические объекты.
double **p = new double*; // динамическое выделение памяти под указатель double double value = 2; double *index = new double; // динамическое выделение памяти под объект типа double index = &value; // Передаем указателю адрес переменной value; p = &index; // передаем указателю адрес указателя index; cout
- Вопрос задан более трёх лет назад
- 5122 просмотра
Правильное удаление указателей
Здравствуйте! У меня возник простой вопрос чисто академического характера. Допустим, где-то в коде происходит создание динамического массива:
int *pi = new int[3];
- delete pi;
- delete [] pi;
- delete [3] pi;
Отслеживать
51.2k 86 86 золотых знаков 266 266 серебряных знаков 505 505 бронзовых знаков
задан 11 ноя 2012 в 19:16
2,539 3 3 золотых знака 22 22 серебряных знака 33 33 бронзовых знака
@Roman Goriachevskiy, интересно, что тогда в моем случае удалит первая конструкция?
11 ноя 2012 в 19:24
Вроде как все будет зависеть от реализации компилятора.
11 ноя 2012 в 19:28
Скорее всего первый элемент. Или UB.
11 ноя 2012 в 19:43
@Asen, вот здесь замечательно рассмотрен данный вопрос. А также внимательно прочитайте обсуждение и подумайте, насколько сложная в общем случае схема получается.
11 ноя 2012 в 19:47
Только вопрос не академического, а исключительно практического интереса.
11 ноя 2012 в 20:26
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Первый удаляет указатель, а не массив. Второй удаляет массив. Ну а по поводу третьего, в С++ вроде не нужно указывать размер массива.
Так что правильно удалить ваш динамический массив можно вторым способом.
А лучше найди доку по этому вопросу там будет всё подробно расписано. Там вроде как если удаляешь со скобками то будут вызваны деструкторы если массив объектов.
Как очистить указатель на char в Си?
У меня есть функция, funcrion(FILE *in, char *result) пишушая некую последовательность символов в строку result. Однако, чтобы каждый раз записывать новую последовательность, необходимо внутри функции очистить строку result перед тем, как писать в неё что-либо, дабы не появлялись лишние символы (например, при первом вызове было записано "123456", а при втором нужно записать "abc". Если не очищать, получается второй раз "abc456").
Как это сделать, подскажите, пожалуйста!
anonymous
16.01.05 21:17:22 MSK
Re: Как очистить указатель на char в Си?
ужас .. почитай C туториал перед тем как что-то писать ..
записывай '\0' последним символом, с точки зрения C строка это набор символов с '\0' на конце
lg ★★
( 16.01.05 21:30:22 MSK )
Ответ на: Re: Как очистить указатель на char в Си? от lg 16.01.05 21:30:22 MSK
Re: Как очистить указатель на char в Си?
Дело в том, что я пишу строку посимвольно, и когда в первый раз символов больше, чем во второй, у меня остаётся в строке остаток первой.
anonymous
( 16.01.05 21:44:23 MSK )
Ответ на: Re: Как очистить указатель на char в Си? от anonymous 16.01.05 21:44:23 MSK
Re: Как очистить указатель на char в Си?
anonymous (*) (16.01.2005 21:44:23):
> когда в первый раз символов больше, чем во второй, у меня остаётся в строке остаток первой.
Попробуй еще раз прочитать то, что тебе ответил lg. Он прямо ответил на то, что надо делать, ". когда в первый раз символов больше, чем во второй. ".