Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
2 / 2 / 1
Регистрация: 06.05.2013
Сообщений: 34
1

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

20.07.2013, 22:35. Просмотров 3564. Ответов 5
Метки нет (Все метки)

Вопрос 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[])?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2013, 22:35
Ответы с готовыми решениями:

Освобождение памяти, выделенной на динамический массив структур
Есть динамический массив структур. Как я понимаю, delete A не производит полной очистки памяти в...

Освобождение памяти, выделенной под массив
Выделяю память под массив: int (*array_1) = new int; как освободить то, что выделил? ...

Освобождение памяти, выделенного под динамический массив
Нужно освободить участок памяти, выделенный под динамический массив при помощи функции. Однако...

Освобождение памяти, выделенной под переменную во внутренней функции
Подскажите, какая команда служит для освобождения памяти, заданной под переменную в matlab во...

5
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
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;
0
What a waste!
1576 / 1277 / 171
Регистрация: 21.04.2012
Сообщений: 2,677
20.07.2013, 23:10 3
Цитата Сообщение от newlam Посмотреть сообщение
Вопрос 1.
Возможно под косвенным обращением подразумевается вызов с помощью указателя на метод? Так вызов виртуального метода тоже можно считать косвенным...
1
2 / 2 / 1
Регистрация: 06.05.2013
Сообщений: 34
20.07.2013, 23:28  [ТС] 4
Да, наверное так. Сделаю через второй вариант (в топике). Второй и первый получается просто указывают на свойства и методы для ( obj(n,m) -первый случай и connect- второй). А в третьем обращается через -> , но чем он тогда отличается от прямого? А в первых двух случаех обращение происходит через другие переменные,этого класса. Первый можно считать решенным
0
What a waste!
1576 / 1277 / 171
Регистрация: 21.04.2012
Сообщений: 2,677
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"
}
1
375 / 226 / 79
Регистрация: 24.11.2009
Сообщений: 698
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 дело говорит.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2013, 01:23

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Массив: Освобождение выделенной памяти
Сказали переделать код, нужно что бы память освобождалась не в отдельной функции а как то по...

Выделение памяти под динамический двумерный массив в структуре
Доброво времени суток, дорогие товарищи-кодеры! Работав проектом, столкнулся с тем что удобно...

При освобождении памяти под двумерный динамический массив way выскакивает EAcessViolation
Здравствуйте. Помогите, пожалуйста, разобраться с такой проблемой. При освобождении памяти под...

Освобождение выделенной памяти
Здравствуйте! Есть структура, выглядит, например, так: struct some_structure { int* s; } ...


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

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

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