Как удалить указатель c
Перейти к содержимому

Как удалить указатель c

  • автор:

Удаление указателей

Вот код, на строке 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++?

dd0c0b5cff3848ad883168f4d1682b9d.jpg

Дан указатель
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]; 
  1. delete pi;
  2. delete [] pi;
  3. 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. Он прямо ответил на то, что надо делать, ". когда в первый раз символов больше, чем во второй. ".

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *