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

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

Войти
Регистрация
Восстановить пароль
 
plotter
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 6
#1

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

02.08.2014, 16:20. Просмотров 261. Ответов 7
Метки нет (Все метки)

Сабж, получается после выхода из функции указатель удаляется, а выделенная память не освободится, так? Отсюда вопрос: как организовать удаление? Пробовал
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++
Здравствуйте. Кто-нибудь знает почему при выделении памяти в функции set для массива b выводит `S) `S) `S) Duality isn't what it...

Динамическое выделение памяти в функции - C++
Здравствуйте, столкнулся с такой проблемой: Нужно в функции считать из файла количество строк и столбцов, затем создать динамический...

Выделение динамической памяти в функции - C++
Прив. У меня следующая проблема: Необходимо выделить память на массив символьных строк, разбив всю программу на функции. Вот код....

Выделение памяти в функции на примере калькулятора - C++
#include &quot;stdafx.h&quot; #include &quot;std_lib_facilities.h&quot; #include &quot;windows.h&quot; //------------------------------------------------- class...

Указатели и функции. Динамическое выделение памяти - C++
1) Напишите программу, которая позволяет вводить динамический одно-мерный целочисленный массив и посредством вызова функции опреде-лять...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetHelp
-7 / 61 / 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
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,358
Завершенные тесты: 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
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
02.08.2014, 18:02     Выделение памяти оператором new в функции и возращение ею этого значения #6
plotter, я не понимаю: вы хотите сделать обёртку над массивом фиксированного размера?
Evg
Эксперт CАвтор FAQ
17469 / 5707 / 362
Регистрация: 30.03.2009
Сообщений: 15,664
Записей в блоге: 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++
есть массив указателей на int, объявленный глобально int* arr; но заранее я не знаю, сколько мне понадобится одномерных массивов -...

Выделение памяти под укзатель переданный функции - C++
Доброго времени суток, форумчане! :) Вот коды нужных файлов: //main.cpp #include &quot;func.h&quot; char *name; char *p; ...

Выделение динамической памяти указателю в локальной функции - C++
Собственно, я не до конца понимаю, что происходит, поэтому прошу если кто может как можно доходчивее пояснить. Упрощенная версия кода...

Динамическое выделение памяти для структуры в функции - C++
Объясните не могу понять. На С++ пишу совсем недавно. Суть вопроса, при первом запуске программы происходит проверка на существование...


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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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 в функции и возращение ею этого значения
Ответ Создать тему
Опции темы

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