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

Разобраться с delete [] - C++

Восстановить пароль Регистрация
 
dyosick
 Аватар для dyosick
61 / 61 / 6
Регистрация: 25.08.2008
Сообщений: 178
13.02.2011, 23:24     Разобраться с delete [] #1
Господа программисты!!! Помогите решить проблему.

Есть матрица, созданная динамично

C++
1
2
3
int **matrix = new int*[M];
for (int i = 0; i < M; i++) 
    matrix[i] = new int[N];
Ну и загажена всякими числами
C++
1
2
3
for (int i = 0; i < M; i++) 
    for (int j = 0; j < N; j++)   
         matrix[i][j]=rand();
То если я применяю операцию
C++
1
delete[] matrix[numberOfRow];
не удаляется целая строка из матрицы, по крайней мере у меня

Сильно прошу не ругать, если это позорный случай для программиста.
А ещё вот полный код:
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
#include <iostream>
#include <cstdlib>
#include <vector>
#include <iomanip>
 
using namespace std;
 
int main()
{
int numberOfRow=0;
int M=8;
int N=5;
int **matrix = new int*[M];
for (int i = 0; i < M; i++) 
    matrix[i] = new int[N];
 
for (int i = 0; i < M; i++) 
{
    for (int j = 0; j < N; j++) 
    {    
         matrix[i][j]=rand();
         cout<<setw(5)<<matrix[i][j]<<"  ";
    }
    cout<<endl;
}
 
do
{
    cout<<"\nEnter number of row which you want to delete: ";
    cin>>numberOfRow;               
}while(numberOfRow>M || numberOfRow<1);
 
delete[] matrix[numberOfRow-1]; 
 
for (int i = 0; i < M; i++) 
{
    for (int j = 0; j < N; j++) 
         cout<<setw(5)<<matrix[i][j]<<"  ";
    cout<<endl;
}
 
for (int i = 0; i < M-1; i++) 
    delete[] matrix[i];
delete[] matrix;   
 
system("pause");
return 0;    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2011, 23:24     Разобраться с delete []
Посмотрите здесь:

C++ delete this
"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? C++
new - delete C++
C++ delete[]
C++ new[] - delete[]
delete[] *pointer vs. delete pointer и утечка памяти C++
New/Delete C++
New delete C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.02.2011, 00:28     Разобраться с delete [] #2
Строка из матрицы удаляться и не должна - таким оператором вы просто очищаете память, выделенную под данную строку, иными словами, указатель с индексом numberOfRow в массиве указателей matrix будет указывать на память, которую оператор delete[] вернул обратно в кучу. Там могли остаться старые данные, а мог и другой процесс оперативненько занять эту память, и там теперь его данные. Чтобы удалить строку физически (сплющить матрицу, выкинув оттуда строку), надо перевыделить память под новый массив указателей, размером на один меньше предыдущего, скопировать туда все указатели, помимо того, который указывает на удаляемую строку, а затем поменять массивы указателей местами (чтобы matrix указывала на новый массив указателей, а, скажем, какой-нибудь temp - на старую, не модифицированную память) и удалить этот temp. Уфф... Описать это сложнее, чем сделать... Сейчас накидаю что-нибудь сносное.

Добавлено через 21 минуту
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
64
65
66
67
68
#include <iostream>
#include <cstdlib>
#include <ctime>
 
template< typename T >
void delete_row(T **&, size_t &, size_t, size_t);
 
int main()
{
    srand(static_cast< unsigned >(time(0)));
 
    size_t rows = 5, cols = 7;
    int **matrix = new int *[rows];
 
    for (size_t i = 0; i < rows; ++i)
    {
        matrix[i] = new int [cols];
 
        for (size_t j = 0; j < cols; ++j)
            matrix[i][j] = static_cast< int >(-10.0 + 20.0 * rand() / RAND_MAX);
    }
 
    std::cout << "Matrix:" << std::endl;
 
    for (size_t i = 0; i < rows; ++i)
    {
        for (size_t j = 0; j < cols; ++j)
            std::cout << matrix[i][j] << "  ";
 
        std::cout << std::endl;
    }
 
    delete_row(matrix, rows, cols, 1);
    delete_row(matrix, rows, cols, 3);
 
    std::cout << std::endl << "New matrix:" << std::endl;
 
    for (size_t i = 0; i < rows; ++i)
    {
        for (size_t j = 0; j < cols; ++j)
            std::cout << matrix[i][j] << "  ";
 
        std::cout << std::endl;
    }
 
    for (size_t i = 0; i < rows; ++i)
        delete [] matrix[i];
 
    delete [] matrix;
 
    return 0;
}
 
template< typename T >
void delete_row(T **&matrix, size_t &rows, size_t cols, size_t deleted_row)
{
    T **new_matrix = new T *[rows - 1];
 
    for (size_t k = 0, i = 0; k < rows; ++k)
        if (k != deleted_row)
            new_matrix[i++] = matrix[k];
 
    delete [] matrix[deleted_row];
    delete [] matrix;
 
    matrix = new_matrix;
    --rows;
}
Yandex
Объявления
14.02.2011, 00:28     Разобраться с delete []
Ответ Создать тему
Опции темы

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