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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dyosick
61 / 61 / 6
Регистрация: 25.08.2008
Сообщений: 178
#1

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

13.02.2011, 23:24. Просмотров 357. Ответов 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 и delete[]? - C++
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? - C++
Я правильно понимаю, что &quot;delete a, b;&quot; эквивалентно &quot;delete a; delete b;&quot; ?

new[] - delete[] - C++
Всем привет. Глупый вопрос, но тем не менее, он меня крайне заинтересовал. Вот например, есть такой код: void main() { int...

delete this - C++
Какие последствия могут быть при выполнении команды delete this; из какой-нибудь функции члена?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
14.02.2011, 00:28 #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2011, 00:28
Привет! Вот еще темы с ответами:

delete[] - C++
подскажите пожалуйста как заставить это работать? Вылетает на строчке delete. Выделяю ведь память с помощью оператора new. А в идеале...

delete this - C++
Добрый день! У меня возник такой вопрос - почему в программе возникает неопределённое поведение для объекта, в деструкторе которого...

new и delete - C++
Ошибка, незнаю как для моего класса выделить память. Как исправить? class MyClass { int a, b, c; public: MyClass(int a,...

delete[] - C++
Здравствуйте! Имеется след. код: char* values = new char; values = '\0'; ////ещё код//// delete values; Вопрос - почему...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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