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

Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
newlam
 Аватар для newlam
2 / 2 / 0
Регистрация: 06.05.2013
Сообщений: 19
20.07.2013, 22:35     Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив #1
Вопрос 1.
В задании необходимо проиллюстрировать косвенный способ обращения к методам.
Искал в интернете. Нашел :
C++
1
2
3
4
Array *s, obj(n, m);
    s =& obj;
    s->set();
    s->print();
Где Array - это название класса (class Array ...)

Также видел
C++
1
2
3
4
5
Array connect;
Array * access;
access =&connect;
access->Set();
access->Print();
Вообще читал, что косвенное обращение это "->"
Можно сделать так:
C++
1
2
3
4
Array * access=new Array;
access->Set();
access->Print();
delete[] access;
Как правильно будет проиллюстрировать косвенный способ обращения к методам? Может как-то иначе?

Вопрос 2.
В необходимо создать двумерный динамический массив , с помощью функции calloc. Вот как создал :
C++
1
2
3
4
5
6
7
8
9
 Array::Array() {
        cout<<"Введите количество строк : "<<endl;
        cin>>a;
        cout<<"Введите количество столбцов : "<<endl;
        cin>>b;
        mas=((int**)calloc(a,sizeof(int*)));
        for (int i=0;i<a;i++) {
            mas[i]=((int*)calloc(b,sizeof(int)));
        }
где mas- массив, объявленный в public класса Array (public: int ** mas
Чтобы освободить память, выделенную под массив, нужно использовать
C++
1
for(int i=0;i<a;i++) free(mas[i]);
До этого я пользовался таким выделением памяти:
C++
1
2
3
4
int ** mas=new int*[10];
    for (int i=0;i<10;i++) {
        mas[i]=new int[10];
    }
высвобождение :
C++
1
2
3
    for (int i=0;i<10;i++) {
        delete mas[i]; }
    delete[] mas;
Вопрос, правильно ли высвобождается память в обоих случаях?
Какой удобнее?
И зачем после delete ставятся пустые квадратные скобки (delete[])?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2013, 22:35     Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив
Посмотрите здесь:

Корректно ли освобождение выделенной памяти? C++
C++ Освобождение памяти, выделенной под массив
C++ Массив: Освобождение выделенной памяти
C++ Выделение памяти под двумерный массив
Как выделить память под динамический двумерный массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
20.07.2013, 23:10     Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив #2
Цитата Сообщение от newlam Посмотреть сообщение
Какой удобнее?
Задай этот вопрос себе.
Для меня удобнее такой:
C++
1
2
3
4
5
    char (*a)[4][4][4] = new char [4][4][4][4];
    ...
    a[1][1][1][1] = 123;
    ...
    delete [] a;
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.07.2013, 23:10     Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив #3
Цитата Сообщение от newlam Посмотреть сообщение
Вопрос 1.
Возможно под косвенным обращением подразумевается вызов с помощью указателя на метод? Так вызов виртуального метода тоже можно считать косвенным...
newlam
 Аватар для newlam
2 / 2 / 0
Регистрация: 06.05.2013
Сообщений: 19
20.07.2013, 23:28  [ТС]     Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив #4
Да, наверное так. Сделаю через второй вариант (в топике). Второй и первый получается просто указывают на свойства и методы для ( obj(n,m) -первый случай и connect- второй). А в третьем обращается через -> , но чем он тогда отличается от прямого? А в первых двух случаех обращение происходит через другие переменные,этого класса. Первый можно считать решенным
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
21.07.2013, 00:42     Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив #5
newlam, я ничего не понял, если честно)
Я это так вижу: когда вызываешь метод через указатель на объект (с помощью селектора ->), то это косвенное обращение к объекту (разыменование указателя на объект и вызов метода); можно ли это назвать косвенным вызовом метода я не знаю. Ваши первые два варианта идентичны: в обоих вызов через указатель.
Про указатели на метод - я примерно такое имел ввиду, как пример:
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
#include <iostream>
 
 
struct type {
 
   void a() {
      std::cout << "a" << std::endl;
   }
 
   void b() {
      std::cout << "b" << std::endl;
   }
};
 
 
int main() {
   typedef void (type::*method_ptr_t)();
 
   type t;
 
   method_ptr_t method = &type::a;
   (t.*method)();   // prints "a"
 
   method = &type::b;
   (t.*method)();   // prints "b"
}
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
21.07.2013, 01:23     Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив #6
Вопрос, правильно ли высвобождается память в обоих случаях?
Какой удобнее?
И зачем после delete ставятся пустые квадратные скобки (delete[])?
if new then delete
if new[] then delete[]
if malloc or calloc then free
----upd:grey_fox дело говорит.
Yandex
Объявления
21.07.2013, 01:23     Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив
Ответ Создать тему
Опции темы

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