Форум программистов, компьютерный форум CyberForum.ru

Как правильно удалять выделенную память под указатель на указатель? - C++

Восстановить пароль Регистрация
 
Spirit370
 Аватар для Spirit370
1 / 1 / 2
Регистрация: 08.08.2013
Сообщений: 86
01.07.2015, 13:15     Как правильно удалять выделенную память под указатель на указатель? #1
есть код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
void sort_1(const int **&const ptr,const int& N)
{
    for (int i = N - 1; i >= 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            if (*ptr[j] > *ptr[j + 1])
            {
                const int *tmp = ptr[j];
                ptr[j] = ptr[j + 1];
                ptr[j + 1] = tmp;
            }
        }
    }
}
void ptr_out(const int **&const ptr, const int& N)
{
    for (int i = 0; i < N; i++)
    {
        cout << ptr[i] << "  =   " << *ptr[i] << endl;
    }
}
int main()
{
 
    srand(time(0));
    int const N = 10;
    int mas[N];
    char exit = ' ';
do
{
    for (int i = 0; i < N; i++)
    {
        mas[i] = 1 + rand() % 100;
    }
    const int **ptr = new const int *[N]{&mas[0], &mas[1], &mas[2], &mas[3], &mas[4],
        &mas[5], &mas[6], &mas[7], &mas[8], &mas[9]};
    cout << "               ptr = " << ptr << endl;
 
    ptr_out(ptr, N);
 
    sort_1(ptr, N);
    
    cout << endl << endl << "         SORT " << endl;
 
    ptr_out(ptr, N);
    
    delete[] ptr;
 
    cout << "Exit(y/n)?";
    exit = getch();
}
while (exit != 'Y' || exit != 'y');
}

Выделяется память:
C++
1
2
const int **ptr = new const int *[N]{&mas[0], &mas[1], &mas[2], &mas[3], &mas[4],
        &mas[5], &mas[6], &mas[7], &mas[8], &mas[9]};
и после етого
C++
1
delete[] ptr;
вроде бы все ровно, но я сомневаюсь. Я правильно высвободил память?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2015, 13:15     Как правильно удалять выделенную память под указатель на указатель?
Посмотрите здесь:

Проверка выделена ли память под указатель C++
C++ как сделать правильно указатель на первую функцию
C++ Не знаю как правильно передать указатель
C++ Не могу удалить динамически выделенную память под массив
C++ Как правильно кастовать указатель на константную ф-ю
C++ Не могу понять, как правильно передать указатель на объект в файл
Очистить динамическую память, выделенную под член структуры C++
C++ Три непонятности: память в union, указатель на функцию и ->
C++ Нужно ли удалять указатель на символьный массив созданный в куче(динамически распределяемой памяти)
C++ Как и когда правильно освобождать динамически выделенную память?
C++ Сырой указатель на память выделенную через new[]
C++ Как правильно передать массив через указатель?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ThePlague
 Аватар для ThePlague
95 / 95 / 59
Регистрация: 30.06.2015
Сообщений: 262
01.07.2015, 13:22     Как правильно удалять выделенную память под указатель на указатель? #2
А зачем через NEW если длинна массива известна ?
Spirit370
 Аватар для Spirit370
1 / 1 / 2
Регистрация: 08.08.2013
Сообщений: 86
01.07.2015, 14:04  [ТС]     Как правильно удалять выделенную память под указатель на указатель? #3
я просто експерементирую

Добавлено через 31 минуту
Ладно, я переписал, но можно как-то иннициализировать массив указателей без создания массива ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
void sort_1( int **&const ptr,const int& N)
{
    for (int i = N - 1; i >= 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            if (*ptr[j] > *ptr[j + 1])
            {
                 int *tmp = ptr[j];
                ptr[j] = ptr[j + 1];
                ptr[j + 1] = tmp;
            }
        }
    }
}
void ptr_out( int **&const ptr, const int& N)
{
    for (int i = 0; i < N; i++)
    {
        cout << ptr[i] << "  =   " << *ptr[i] << endl;
    }
}
int main()
{
 
    srand(time(0));
    int const N = 10;
    int mas[N];
    char exit = ' ';
do
{
    int mas[N];
    int *p[N];
    int **pp{ p };
    for (int i = 0; i < N; i++)
    {
        mas[i] = 1 + rand() % 99;
    }
    for (int i = 0; i < N; i++)
    {
        p[i] = &mas[i];
    }
 
    cout << "               ptr = " << pp << endl;
 
    ptr_out(pp, N);
 
    sort_1(pp, N);
    
    cout << endl << endl << "         SORT " << endl;
 
    ptr_out(pp, N);
    
    cout << "Exit(y/n)?";
    exit = getch();
}
while (exit != 'Y' || exit != 'y');
}
Добавлено через 9 минут
ThePlague
Yandex
Объявления
01.07.2015, 14:04     Как правильно удалять выделенную память под указатель на указатель?
Ответ Создать тему
Опции темы

Текущее время: 22:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru