Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2013, 17:08   #1
Devdev12
Пользователь
 
Регистрация: 03.11.2012
Сообщений: 19
По умолчанию Динамическое выделение памяти

Нужна помощь, ибо непонятно, как же ее правильно выделять. У меня есть класс, у него указатель на указатель на какой-то объект. Мне нужно выделить память по некоторое колво указателей на этот объект, но заранее не известно сколько их - это определяется в методе. Как правильно выделить память? В самом методе это сделать не получится(так, что потом к этой фигне я мог обратиться)? Как это правильно делать?
Devdev12 вне форума Ответить с цитированием
Старый 28.07.2013, 17:35   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
У меня есть класс, у него указатель на указатель на какой-то объект.
у меня нет класса, ты рассчитываешь на помощь?
rrrFer вне форума Ответить с цитированием
Старый 28.07.2013, 17:50   #3
Devdev12
Пользователь
 
Регистрация: 03.11.2012
Сообщений: 19
По умолчанию

В смысле? Я вообще говорю:

есть класс, у него указатель на указатель на объект. требуется выделить память для некоторого кол-ва объектов, это кол-во мы "узнаем" из метода. В методе же нельзя выделять память, если объект будет использоваться в других областях видимости? Как тогда это делается(если нельзя)?
Devdev12 вне форума Ответить с цитированием
Старый 28.07.2013, 18:02   #4
Marker21
Пользователь
 
Аватар для Marker21
 
Регистрация: 26.07.2013
Сообщений: 20
По умолчанию

Почему не выделить память после выполнение метода, зарание присвоив в методе кол-во объектов глобальной переменной?
P.S. Можно увидеть код?
Marker21 вне форума Ответить с цитированием
Старый 28.07.2013, 18:16   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

кто мешает в методы выделить эту память?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.07.2013, 19:08   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
у меня нет класса, ты рассчитываешь на помощь?
Цитата:
P.S. Можно увидеть код?
ТС, тебе вопросы не кажутся похожими?
Как мы можем тебе помочь, когда ты рассуждаешь о каких-то невидимых сущностях, которые представил только ты? - я вот вобще проблемы не вижу.

Цитата:
Мне нужно выделить память по некоторое колво указателей на этот объект, но заранее не известно сколько их - это определяется в методе.
определил сколько их и сразу после этого выделил память, что-то еще?
rrrFer вне форума Ответить с цитированием
Старый 28.07.2013, 19:30   #7
Devdev12
Пользователь
 
Регистрация: 03.11.2012
Сообщений: 19
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
определил сколько их и сразу после этого выделил память, что-то еще?
я просто вот про что:

Код:
class someclass
{
    SomeType** ppType;
    void method(int a)
    {
        ppType = new SomeType*[a]; //вот эта память никуда не пропадет после выхода из метода?
        for (int i = 0; i<a;i++)
            *(ppType+i) = new SomeType;
        method_();
    }

    void method_()
    {
        //будет ли ppType полностью инициализирован? Смогу ли я обратиться  к его элементам, разыменовать их? 
    }
}
Devdev12 вне форума Ответить с цитированием
Старый 28.07.2013, 20:10   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
ppType = new SomeType*[a]; //вот эта память никуда не пропадет после выхода из метода?
а с чего она должна пропасть?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.07.2013, 20:12   #9
Marker21
Пользователь
 
Аватар для Marker21
 
Регистрация: 26.07.2013
Сообщений: 20
По умолчанию

Цитата:
вот эта память никуда не пропадет после выхода из метода?
Нет, не пропадет. Выделенная динамически, память будет существовать до моментнта ее удаления.

Цитата:
будет ли ppType полностью инициализирован? Смогу ли я обратиться к его элементам, разыменовать их?
Да, сможете. Если вы обьявили ppType в private: то он будет доступен лишь членам класса, если в в public: то он будет доступен всей программе.
Marker21 вне форума Ответить с цитированием
Старый 28.07.2013, 21:23   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Devdev12 Посмотреть сообщение
я просто вот про что:

Код:
class someclass
{
    SomeType** ppType;
    void method(int a)
    {
        ppType = new SomeType*[a]; //вот эта память никуда не пропадет после выхода из метода?

    // <--- да, память выделенная на куче никуда не пропадет
    // пока кто нибудь не грохнет её так же явно, как и выделял

        for (int i = 0; i<a;i++)
            *(ppType+i) = new SomeType;
        method_();
    }

    void method_()
    {
        //будет ли ppType полностью инициализирован? Смогу ли я обратиться  к его элементам, разыменовать их? 

       //Не факт. Зависит от того, был ли предварительно вызван
       //Предыдущий метод
    }
}
Проблема этого кода концептуальна: захват ресурса осуществляется из какого то левого метода класса, а не в конструкторе:

Код:
someclass someobj;
someobj.method(0); //<-- есть захват
someobj.method_(); //<-- ок. работа с захваченным ресурсом
Если удалить запуск метода, который организует захват, то все остальные функции, которые используют ресурс - поломаются.

В реальном коде такие классы не инвариантные, и чем то смахивают на спаггети.


Существует простое правило: тот, кто ресурс выделял, тот его и освобождает.

В твоем случае, захват ресурса лучше организовать в конструкторе класса. А освобождение - в диструкторе.

Тогда весь функционал класса безопасно сможет обращаться к ресурсу.

Последний раз редактировалось _Bers; 28.07.2013 в 21:26.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое выделение динамической памяти GAleX1 Общие вопросы C/C++ 3 29.03.2013 23:18
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44
Массив указателей, динамическое выделение памяти Андрей! Общие вопросы C/C++ 11 09.02.2012 01:05
Динамическое выделение памяти , realloc. _-Re@l-_ Общие вопросы C/C++ 8 03.11.2011 10:20
Динамическое выделение памяти FW-TOT Общие вопросы C/C++ 2 19.12.2008 00:42