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

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

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

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

02.08.2014, 16:20. Просмотров 267. Ответов 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];
    }
};
Но эта скотина требует константы в шаблоне при создании, и смысл всего класса теряется полностью.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2014, 16:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти оператором new в функции и возращение ею этого значения (C++):

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

Динамическое выделение памяти внутри функции (что вернуть из функции, если не удалось выделить память?) - C++
такое дело, есть функция, которая выполняет некоторую операцию, функция при успешном выполнении должна вернуть 0, при ниудачном код...

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

Выделение памяти в функции - C++
Здравствуйте. Кто-нибудь знает почему при выделении памяти в функции set для массива b выводит `S) `S) `S) Duality isn't what it...

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

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

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

Не по теме:

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

0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
02.08.2014, 18:02 #6
plotter, я не понимаю: вы хотите сделать обёртку над массивом фиксированного размера?
0
Evg
Эксперт CАвтор FAQ
17826 / 6036 / 388
Регистрация: 30.03.2009
Сообщений: 16,567
Записей в блоге: 26
02.08.2014, 18:05 #7
Цитата Сообщение от plotter Посмотреть сообщение
Но эта скотина требует константы в шаблоне при создании
При таком раскладе вместо

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

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

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

Понятно, что класс vector было бы удобнее, но для получения опыта полезно всё-таки такие вещи вручную для начала поделать
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.08.2014, 21:39 #8
Цитата Сообщение от plotter Посмотреть сообщение
C++
1
memset(ptr, 0, sizeof(T) * size);
Выполнять такие действия для совершенно неизвестного типа T нельзя. Всё что нужно, должно быть сделано в конструкторе строчкой выше.
Цитата Сообщение от plotter Посмотреть сообщение
C++
1
if (index > Size) return ptr[Size];
Эпичненькая проверка. Учитывая что элемент с индексом Size - это уже выход за границы.
В таких случаях либо вообще не делают проверку, либо бросают исключение. В крайнем случае - выставить какой-то код ошибки.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 21:39
Привет! Вот еще темы с ответами:

Выделение памяти в процессе выполнения функции - C++
есть массив указателей на int, объявленный глобально int* arr; но заранее я не знаю, сколько мне понадобится одномерных массивов -...

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.08.2014, 21:39
Ответ Создать тему
Опции темы

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