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

Выделение памяти оператором new в функции и возращение ею этого значения - C++

Восстановить пароль Регистрация
 
plotter
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 6
02.08.2014, 16:20     Выделение памяти оператором new в функции и возращение ею этого значения #1
Сабж, получается после выхода из функции указатель удаляется, а выделенная память не освободится, так? Отсюда вопрос: как организовать удаление? Пробовал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <typename T, UINT size> class ARRAY{
    void *ptr;
    UINT Size;
public:
    ARRAY(){
        Size = size;
        T ptr = new T[size];
        memset(ptr, 0, sizeof(T) * size);
    };
    virtual ~ARRAY(){
        delete[] ptr;
        ptr = 0;
    };
    T operator[](UINT index){
        if (index > Size) return ptr[Size];
        else return ptr[index];
    }
};
Но эта скотина требует константы в шаблоне при создании, и смысл всего класса теряется полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2014, 16:20     Выделение памяти оператором new в функции и возращение ею этого значения
Посмотрите здесь:

Выделение динамической памяти в функции C++
C++ Указатели и функции. Динамическое выделение памяти
C++ Выделение динамической памяти указателю в локальной функции
Выделение памяти для массива через функцию и использование этого массива C++
Вызов функции динамического выделение памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 16:49     Выделение памяти оператором new в функции и возращение ею этого значения #2
Цитата Сообщение от plotter Посмотреть сообщение
void *ptr;
Цитата Сообщение от plotter Посмотреть сообщение
T ptr = new T[size];
как это понимать? объявляй тогда уж T* ptr... а касательно удаления, ну при удалении экземпляра класса вон ты написал удаление, так и норм, какие проблемы то? ptr = 0 не обязательно писать... и вообще я тоже пытался писать такие велосипеды с шаблонами недавно, а потом открыл для себя vector и все это стало ненужным
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,215
Завершенные тесты: 1
02.08.2014, 16:50     Выделение памяти оператором new в функции и возращение ею этого значения #3
plotter, используйте умные указатели. Но лучше всего использовать std::array или std::vector, вместо того чтобы писать свою реализацию.
plotter
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 6
02.08.2014, 17:24  [ТС]     Выделение памяти оператором new в функции и возращение ею этого значения #4
GetHelp, да, верно, T там явно лишнее, виноват, спасибо
schdub, спасибо
-=ЮрА=-
02.08.2014, 17:38
  #5

Не по теме:

Цитата Сообщение от schdub Посмотреть сообщение
Но лучше всего использовать std::array или std::vector, вместо того чтобы писать свою реализацию.
- иногда это полезно

CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
02.08.2014, 18:02     Выделение памяти оператором new в функции и возращение ею этого значения #6
plotter, я не понимаю: вы хотите сделать обёртку над массивом фиксированного размера?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
02.08.2014, 18:05     Выделение памяти оператором new в функции и возращение ею этого значения #7
Цитата Сообщение от plotter Посмотреть сообщение
Но эта скотина требует константы в шаблоне при создании
При таком раскладе вместо

C++
void *ptr;
для поля класса имеет смысл писать

C++
T arr[size];
т.е. память сразу же выделять как часть объекта

Конкретно в твоём коде внутри конструктора НЕ надо заводить локальную переменную, куда запоминаешь адрес памяти, а писать этот адрес напрямую в поле ptr твоего класса, предварительно объявив его тип как "T*", как тебе порекомендовали в посте #2.

Понятно, что класс vector было бы удобнее, но для получения опыта полезно всё-таки такие вещи вручную для начала поделать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 21:39     Выделение памяти оператором new в функции и возращение ею этого значения
Еще ссылки по теме:

Возращение значения в рекурсии C++
Динамическое выделение памяти для структуры в функции C++
Выделение памяти в процессе выполнения функции C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.08.2014, 21:39     Выделение памяти оператором new в функции и возращение ею этого значения #8
Цитата Сообщение от plotter Посмотреть сообщение
C++
1
memset(ptr, 0, sizeof(T) * size);
Выполнять такие действия для совершенно неизвестного типа T нельзя. Всё что нужно, должно быть сделано в конструкторе строчкой выше.
Цитата Сообщение от plotter Посмотреть сообщение
C++
1
if (index > Size) return ptr[Size];
Эпичненькая проверка. Учитывая что элемент с индексом Size - это уже выход за границы.
В таких случаях либо вообще не делают проверку, либо бросают исключение. В крайнем случае - выставить какой-то код ошибки.
Yandex
Объявления
02.08.2014, 21:39     Выделение памяти оператором new в функции и возращение ею этого значения
Ответ Создать тему
Опции темы

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