что среди этих двух случаев приведет к утечке памяти - PullRequest
0 голосов
/ 07 мая 2020

с помощью delete:

int** a=new int*;
**a=5;
delete a;

с помощью delete []:

int** a=new int*;
**a=5;
delete[] a;

Чтобы выяснить это, я попытался сделать это -

int** a=new int*;
**a=5;
int* b=new int;
b=*(a);
delete[] a;
cout<<"*b: "<<*b;

получение вывода - 5

но я подозреваю, что целое число, хранящееся в b, могло быть удалено, но не изменено (нет веской причины сразу получать значение мусора).

Что мне делать, чтобы найти out (или каков ответ).

Ответы [ 2 ]

2 голосов
/ 07 мая 2020
int** a=new int*;
**a=5;

Эти две линии уже совсем не подходят. Вы выделяете новый указатель на int, который ни на что не указывает. Затем вы пытаетесь установить int, на которое он указывает, но он не указывает ни на какой int.

Это не отличается от:

int *a;
*a = 5;

Так что ничего после этого будет иметь смысл, поскольку вы, возможно, написали 5 в какую-то случайную область памяти.

1 голос
/ 07 мая 2020
int** a=new int*;
**a=5;
delete a;

Это неверно, потому что вы выделяете int* и не указываете его на int впоследствии. Доступ к самому int* через *a нормальный, но доступ к int через дополнительный * - это не нормально. Это Undefined Behavior .

Вам нужно добавить это дополнительное int, например:

int** a=new int*;
*a = new int;  // <-- here
**a = 5;       // <-- OK!
delete *a;     // <-- and don't forget this!
delete a;

int** a=new int*;
**a=5;
delete[] a;

Та же проблема, что и выше - назначение несуществующему int через **a - но хуже, потому что теперь вы также не соответствуете new и delete[]. Подробнее Неопределенное поведение . Вы можете использовать delete только с new и delete[] только с new[].


int** a=new int*;
**a=5;
int* b=new int;
b=*(a);
delete[] a;
cout<<"*b: "<<*b;

Это всего лишь кульминация плохого поведения. Не только вы:

  • назначение несуществующему int через **a

  • несоответствие new и delete[]

Но вы также:

  • пропускаете int, который вы изначально выделили для b, чтобы указать на него. Впоследствии вы повторно назначаете b новое (недействительное) значение int*, теряя доступ к назначенному вами int. У вас нет надежды когда-либо использовать действительный оператор delete, чтобы освободить это int.

  • , что еще хуже, вы разыменовываете b для доступа к int после delete 'с адресом памяти, хранящимся в int*, который был назначен b (и этот int* был недопустим для разыменования с самого начала).

Этот код просто все виды Неопределенного поведения .

...