Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
#1

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

18.11.2013, 20:35. Просмотров 753. Ответов 14
Метки нет (Все метки)

Здравтвуйте

есть фу-я удаления матрицы
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.
    }
Данную ф-ию я вызываю в деконструкторе и не понимаю с чего у указателя адрес так поменялся, по идее сам удалиться не мог?!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2013, 20:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление указателя на матрицу (C++):

удаление указателя - C++
char* func() { char *str = new char; strcpy(str, &quot;I am string!&quot;); return str; } .. далее char *a; a = func(); delete a; ...

Удаление указателя - C++
Доброго времени суток! Возник вопрос: безопасно ли таким способом удалять указатели? std::vector&lt;MyClass*&gt; vec; //создание ...

Удаление и создание указателя в игре - C++
Добрый вечер. Долгое время сижу с кодом, не придет в голову: Нужно, чтобы при пересечении на тайлмапе координат игрока/64 и символа 'b'...

Удаление указателя на объект класса - C++
Что-то ни как не могу разобраться, где у меня ошибка?! Ниже приведен фрагмент кода: //... shapes *ptr=0; //ptr - указатель базового...

Удаление указателя, в классе не содержащем объекта - C++
Подскажите, в классе объявляю указатель на объект, сам объект создан в не этого класса, вопрос - нужно ли удалять указатель на этот объект...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

14
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 без []
0
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;
    }
0
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
18.11.2013, 22:09 #4
kirsanv43, вот готовая программа для работы с матрицами Оформить в виде отдельных функций введения, просмотр и определение количества чисел масива
0
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
18.11.2013, 22:14  [ТС] #5
Ded_Vasilij, я не первый раз сталкиваюсь с подобным, интересно все-таки почему так происходит,
ошибка возникает только если вызвать ф-ю в деконструкторе, в иных случаях все работает корректно
0
Ded_Vasilij
231 / 213 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
18.11.2013, 22:20 #6
Цитата Сообщение от kirsanv43 Посмотреть сообщение
деконструкторе
наверное все таки "в деструкторе"
0
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
18.11.2013, 22:28  [ТС] #7
Ded_Vasilij, да, точно
0
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 798
Записей в блоге: 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.
    }
0
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
19.11.2013, 00:03  [ТС] #9
Цитата Сообщение от Qazan Посмотреть сообщение
а у тебя функция ,аналогичная деструктору
деструктор вызывает эту функцию и передает в качестве параметра двумерный массив указателей , объявленный в классе.

Добавлено через 5 минут
т.е диструктор автоматически удаляет этот самый массив указателей и не возникнет ни какой утечки, если я не вызову в нем функцию DeleteMatrix(...)?
0
programina
1914 / 599 / 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);
}
0
kirsanv43
16 / 3 / 1
Регистрация: 05.11.2013
Сообщений: 49
19.11.2013, 03:12  [ТС] #11
Цитата Сообщение от programina Посмотреть сообщение
const int N = 100;
Подобное решение не прокатит, у меня в корень все OOP-о должно быть, препод не примет.
Решил проблему я еще до создания этой темы тем, что удалил деструктор, вообщем утечка памяти поучилась, сильно не плюйтесь, мне интересно почему происходит именно так как происходит, куда девается указатель на массивы указателей.
0
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 798
Записей в блоге: 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;
  }
};
1
ПерС
372 / 288 / 90
Регистрация: 05.11.2013
Сообщений: 821
Записей в блоге: 5
Завершенные тесты: 1
19.11.2013, 17:13 #13
Цитата Сообщение от kirsanv43 Посмотреть сообщение
куда девается указатель на массивы указателей.
не вникал в ветку, но если ты выделял память с нулевой строки до n-1, то удалять надо в обратном порядке, в цикле от n-1 до 0... в любом случае адресация памяти линейна и принцип стека рулит... объект, получивший память последним, первым ее освобождает. Всё остальное - дыры или потенциальные дыры

впрочем, тут много любителей новомодных сред "++4 точки чего-то", которые с этим не согласятся... но они и не обращают внимания на утечку 10-100 Мб, смело пиша realloc'и в своём коде... опять же, потом работа по модернизации финансируется
1
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; выдаст ошибку
0
Qazan
211 / 59 / 9
Регистрация: 30.04.2013
Сообщений: 798
Записей в блоге: 10
20.11.2013, 13:42 #15
- может у тебя нет конструктора по умолчанию для зануления адреса
- обрати внимание переменная п указатель
и скинь весь код елкин дом
0
20.11.2013, 13:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2013, 13:42
Привет! Вот еще темы с ответами:

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using namespace...

Как сделать функцию от указателя на класс и указателя на метод? - C++
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...


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

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

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