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

Удаление указателя на матрицу - C++

Восстановить пароль Регистрация
 
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
18.11.2013, 20:35     Удаление указателя на матрицу #1
Здравтвуйте

есть фу-я удаления матрицы
C
1
2
3
4
5
6
7
8
9
10
11
void DeleteMatrix(double **obj)
    {
        for (int i = 0; i < n; i++)
        {
            delete[] mat[i];
        }
 
        delete [] mat;//Необработанное исключение по адресу 0x57ABA9E8 
//(msvcr120d.dll) в one.exe: 0xC0000005: нарушение прав доступа 
//при чтении по адресу 0xCCCCCCC0.
    }
Данную ф-ию я вызываю в деконструкторе и не понимаю с чего у указателя адрес так поменялся, по идее сам удалиться не мог?!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2013, 20:35     Удаление указателя на матрицу
Посмотрите здесь:

C++ Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0]
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... C++
Получить матрицу из чисел, заполняющих матрицу по линиям, параллельным главной диагонали C++
C++ удаление указателя на объект класса
удаление указателя C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
18.11.2013, 21:15     Удаление указателя на матрицу #2
Цитата Сообщение от kirsanv43 Посмотреть сообщение
void DeleteMatrix(double **obj)
* * {
* * * * for (int i = 0; i < n; i++)
* * * * {
* * * * * * delete[] mat[i];
* * * * }
delete [] mat;//Необработанное исключение по адресу 0x57ABA9E8
//(msvcr120d.dll) в one.exe: 0xC0000005: нарушение прав доступа
//при чтении по адресу 0xCCCCCCC0.
* * }
да тут чушь потому что написана. что такое mat? obj для чего в функцию передаёшь? delete[] удаляет массив целиком, для удаления одного элемента используй delete без []
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
18.11.2013, 22:05  [ТС]     Удаление указателя на матрицу #3
Цитата Сообщение от newbie666 Посмотреть сообщение
да тут чушь потому что написана. что такое mat? obj для чего в функцию передаёшь? delete[] удаляет массив целиком, для удаления одного элемента используй delete без []
C
1
2
3
4
5
6
7
8
void DeleteMatrix(double **obj)
    {
        for (int i = 0; i < n; i++)
        {
            delete[] obj[i];
        }
        delete[] obj;
    }

Передаю double **obj, который специализируется в функции InitMatrix(int sizes)

C
1
2
3
4
5
6
7
8
9
10
11
//sizes - размер массива
double ** InitMatrix(int sizes)
    {
        double **obj = new  double*[sizes];
 
        for (int i = 0; i < sizes; i++)
        {
            obj[i] = new double[sizes];
        }
        return obj;
    }
Ded_Vasilij
 Аватар для Ded_Vasilij
229 / 211 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
18.11.2013, 22:09     Удаление указателя на матрицу #4
kirsanv43, вот готовая программа для работы с матрицами Оформить в виде отдельных функций введения, просмотр и определение количества чисел масива
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
18.11.2013, 22:14  [ТС]     Удаление указателя на матрицу #5
Ded_Vasilij, я не первый раз сталкиваюсь с подобным, интересно все-таки почему так происходит,
ошибка возникает только если вызвать ф-ю в деконструкторе, в иных случаях все работает корректно
Ded_Vasilij
 Аватар для Ded_Vasilij
229 / 211 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
18.11.2013, 22:20     Удаление указателя на матрицу #6
Цитата Сообщение от kirsanv43 Посмотреть сообщение
деконструкторе
наверное все таки "в деструкторе"
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
18.11.2013, 22:28  [ТС]     Удаление указателя на матрицу #7
Ded_Vasilij, да, точно
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 778
Записей в блоге: 10
18.11.2013, 23:15     Удаление указателя на матрицу #8
Цитата Сообщение от kirsanv43 Посмотреть сообщение
Здравтвуйте

есть фу-я удаления матрицы
C
1
2
3
4
5
6
7
8
9
10
11
void DeleteMatrix(double **obj)
    {
        for (int i = 0; i < n; i++)
        {
            delete[] mat[i];
        }
 
        delete [] mat;//Необработанное исключение по адресу 0x57ABA9E8 
//(msvcr120d.dll) в one.exe: 0xC0000005: нарушение прав доступа 
//при чтении по адресу 0xCCCCCCC0.
    }
Данную ф-ию я вызываю в деконструкторе и не понимаю с чего у указателя адрес так поменялся, по идее сам удалиться не мог?!
может пото му что тебе нужно удалять то ,что в аргументе
и это не деструктор - деструктор это метод класса ,вызываемый автоматический он обычно,иного пока не видел, не принимает аргументов
а у тебя функция ,аналогичная деструктору

C
1
2
3
4
5
6
7
8
9
10
11
void DeleteMatrix(double **obj)  // подикась в мэине пишешь DeleteMatrix(mat)
    {
        for (int i = 0; i < n; i++)
        {
            delete [] mat[i]; // переменная obj  т е delete [] obj[i]
        }
 
        delete [] mat;// переменная obj  т е delete [] obj[i]  //Необработанное исключение по адресу 0x57ABA9E8 
//(msvcr120d.dll) в one.exe: 0xC0000005: нарушение прав доступа 
//при чтении по адресу 0xCCCCCCC0.
    }
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
19.11.2013, 00:03  [ТС]     Удаление указателя на матрицу #9
Цитата Сообщение от Qazan Посмотреть сообщение
а у тебя функция ,аналогичная деструктору
деструктор вызывает эту функцию и передает в качестве параметра двумерный массив указателей , объявленный в классе.

Добавлено через 5 минут
т.е диструктор автоматически удаляет этот самый массив указателей и не возникнет ни какой утечки, если я не вызову в нем функцию DeleteMatrix(...)?
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.11.2013, 00:11     Удаление указателя на матрицу #10
C++
const int N = 100;
const int M = 100;
 
void DeleteMatrix(double **mat)
{
    for (int i = 0; i < N; i++) delete[] mat[i];
    delete [] mat;
}
 
int main()
{
    double **obj;
    obj = new double * [N];
    for (int i = 0; i < N; i++) obj[i] = new double[M];
 
    DeleteMatrix(obj);
}
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
19.11.2013, 03:12  [ТС]     Удаление указателя на матрицу #11
Цитата Сообщение от programina Посмотреть сообщение
const int N = 100;
Подобное решение не прокатит, у меня в корень все OOP-о должно быть, препод не примет.
Решил проблему я еще до создания этой темы тем, что удалил деструктор, вообщем утечка памяти поучилась, сильно не плюйтесь, мне интересно почему происходит именно так как происходит, куда девается указатель на массивы указателей.
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 778
Записей в блоге: 10
19.11.2013, 16:14     Удаление указателя на матрицу #12
Цитата Сообщение от kirsanv43 Посмотреть сообщение
деструктор вызывает эту функцию и передает в качестве параметра двумерный массив указателей , объявленный в классе.

Добавлено через 5 минут
т.е диструктор автоматически удаляет этот самый массив указателей и не возникнет ни какой утечки, если я не вызову в нем функцию DeleteMatrix(...)?

ты хочешь сказать что у тебя есть класс


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 class YourClass{
   int * member;
 
   void Delete(int * obj)
   { 
      // deleting 
   } 
  // такое конечно бывает но в твоем случае лучше сразу удалять в классе твою переменную ,и не нужно ее 
  // передавать ч/з аргументы когда ты ее и так видишь 
  // И если у тебя есть аргумент,то ды должен работать с аргументом а не исо внешней переменной ,
  // void Methofd(это называется аргумент!) 
  // You understand me ?
   ~YourClass()
   {
      Delete(iunt * obj);
   }
 };
Добавлено через 6 минут
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
class Matrix{
 
 int ** p;
 int N,M;
public:
 Matrix(int width,int height): N(hight), M(width) 
 {
    p = new int[N];
    for(int i = 0;i < N;i++)
    {
       p[i] = new int[M];
    }
 }
 
 // Your methods 
 ~Matrix()
  {
    for(int i = 0;i < N;i++)
    {
       delete [] p[i];
    }
     delete [] p;
  }
};
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 806
Записей в блоге: 5
Завершенные тесты: 1
19.11.2013, 17:13     Удаление указателя на матрицу #13
Цитата Сообщение от kirsanv43 Посмотреть сообщение
куда девается указатель на массивы указателей.
не вникал в ветку, но если ты выделял память с нулевой строки до n-1, то удалять надо в обратном порядке, в цикле от n-1 до 0... в любом случае адресация памяти линейна и принцип стека рулит... объект, получивший память последним, первым ее освобождает. Всё остальное - дыры или потенциальные дыры

впрочем, тут много любителей новомодных сред "++4 точки чего-то", которые с этим не согласятся... но они и не обращают внимания на утечку 10-100 Мб, смело пиша realloc'и в своём коде... опять же, потом работа по модернизации финансируется
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
19.11.2013, 17:19  [ТС]     Удаление указателя на матрицу #14
Цитата Сообщение от Qazan Посмотреть сообщение
ты хочешь сказать что у тебя есть класс
Именно так

Добавлено через 4 минуты
Цитата Сообщение от Qazan Посмотреть сообщение
class Matrix{
int ** p;
*int N,M;
public:
*Matrix(int width,int height): N(hight), M(width)
*{
* * p = new int*[N];
* * for(int i = 0;i < N;i++)
* * {
* * * *p[i] = new int[M];
* * }
*}
// Your methods
*~Matrix()
* {
* * for(int i = 0;i < N;i++)
* * {
* * * *delete [] p[i];
* * }
* * *delete [] p;
* }
};
именно так все и происходит, а на delete [] p; выдаст ошибку
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2013, 13:42     Удаление указателя на матрицу
Еще ссылки по теме:

Удаление указателя C++
C++ Непонятно условие задачи: Вывести исходную матрицу, преобразованную матрицу и вектор Х.
Удаление указателя, в классе не содержащем объекта C++

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

Или воспользуйтесь поиском по форуму:
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 778
Записей в блоге: 10
20.11.2013, 13:42     Удаление указателя на матрицу #15
- может у тебя нет конструктора по умолчанию для зануления адреса
- обрати внимание переменная п указатель
и скинь весь код елкин дом
Yandex
Объявления
20.11.2013, 13:42     Удаление указателя на матрицу
Ответ Создать тему
Опции темы

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