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

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

Войти
Регистрация
Восстановить пароль
 
NaM-Cat
0 / 0 / 0
Регистрация: 15.04.2014
Сообщений: 2
#1

Борьба с поеданием памяти оператором new - C++

15.04.2014, 14:30. Просмотров 262. Ответов 5
Метки нет (Все метки)

Здравствуйте!
Столкнулся с некоторой проблемкой, решение ей не получилось найти. Может у Вас получится.
Имеется код:
C++
1
2
3
4
5
6
7
8
9
10
11
subset vectorTOsubset (vector<int> V)
{
    subset solution;
    solution.N = V.size();
    solution.O = new object [solution.N];
    for (int i=0; i<solution.N; i++)
    {
        solution.O[i] = All.O[V[i]];
    }
    return solution;
}
Предыстория и значения в нем не имеют особого значения.
Вопрос вот в чем. функция vectorTOsubset вызывается на одну тысячу раз за время выполнения программы и, как это можно заметить почти дилетантским взглядом - создание object - solution.O происходит при каждом запуске функции и в заключении (по всем известным правилам) должно удаляться оператором delete. Но вот тут то как раз и загвоздка - я не могу удалить созданный объект, поскольку я его возвращаю через функцию vectorTOsubset. Кто подскажет, какие альтернативы существуют для решения подобной задачи?
На любые вопросы готов ответить.
Ну и напоследок - изменения нужно сделать, по той причине, что программа вылетает при работе с большими объемами, поскольку память, как известно, не резиновая.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2014, 14:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Борьба с поеданием памяти оператором new (C++):

Борьба с утечками памяти - C++
Знаю, что вроде бы есть дополнения к Студии, с помощью которых можно отслеживать утечки.... Или подскажите как это можно сделать...

Экономия памяти или борьба с точками. (что-то типа массива ссылок хотелось бы иметь) - C++
У меня есть объект Point. И есть Объект Grup. В объекте Grup я выделил динамически память под массив объектов типа Point. Чтоб, как бы...

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

Ссылка, Указатель, Область памяти выделенная оператором new для указателя - C++
Подскажите пожалуйста, как сделать ссылку на область памяти выделенную оператором new для указателя читая книгу Джесса Либерти в...

Классовая борьба - C++
Visual Studio 10 express ни с того ни с сего начал ругаться на существующие классы, хотя раньше воспринимал все нормально.. с чем может...

Борьба за ресурсы - C++
Добрый день! Встал вопрос, возможно надуманный. void* a(void* argv) { while(1) { cout &lt;&lt; (char*)argv; } } ...

5
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
15.04.2014, 14:42 #2
Это ж динамический массив... Ну и используйте вектор вместо него.
1
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
15.04.2014, 14:43 #3
Как минимум нужно правильно написать класс subset, а конкретно, конструктор копирования, оператор= и деструктор для него.
1
NaM-Cat
0 / 0 / 0
Регистрация: 15.04.2014
Сообщений: 2
15.04.2014, 23:03  [ТС] #4
1. В данном случае удобно использовать класс subset, который работает с дин.массивами. Хотя, конечно может и можно попробовать в класс прописать вместо дин.массива - вектор...
2. Класс subset элементарный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class point
{
    public:
    double x;
    double y;
};
 
class object
{
    public:
    int N;      //количество точек объекта
    point *P;   //массив точек
    double H;   
    int numb;   //идентификатор объекта; по сути его порядк.номер, что зададим
};
 
class subset
{
    public:
    int N;      //количество объектов в подмножестве
    object *O;  //массив объектов
};
Боюсь, что написание конструктора и деструктора вызовет сложности для меня... Буду признателен если кто-то поможет с этим или хотя бы намекнет, где научится самому. А вот с оператором= несколько не понял.
0
Croessmah
Эксперт CЭксперт С++
13510 / 7668 / 866
Регистрация: 27.09.2012
Сообщений: 18,866
Записей в блоге: 3
Завершенные тесты: 1
16.04.2014, 00:08 #5
Писал на коленке:
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
27
class subset
{
private:
    int N;      //количество объектов в подмножестве
    object *O;  //массив объектов
    void copyFrom ( const subset & src ) {
       N = src.N ;
       O = new object [ N ] ;
       for ( int i = 0 ; i < N ; ++i )
          O[i] = src.O[i] ;
    }
public:
    subset ( int n ) : N ( n ) , O ( new object [n] ) {
    }
    subset ( const subset & src ) {
       copyFrom ( src ) ;
    }
    subset & operator= ( const subset & rhv ) {
       if ( &rhv == this )
          return *this ;
       delete [] O ;
       copyFrom ( rhv ) ;
    }
    ~subset ( ) {
       delete [] O ;
    }
};
с object тоже надо будет
1
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
16.04.2014, 05:24 #6
NaM-Cat, при таком определении вместо всего subset можно использовать вектор.
1
16.04.2014, 05:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2014, 05:24
Привет! Вот еще темы с ответами:

Борьба за кириллицу в MS Visual C++ 6.0 - C++
Для того, что бы выводились символы русского алфавита я знаю такой метод: #include &lt;iostream.h&gt; #include &lt;windows.h&gt; // для...

Борьба с погрешностью при сравнивании double с int - C++
В моей программе происходит много действий с вещественными числами, а потом ответ (тоже вещественное число) сравнивается с целочисленным...

Борьба с чистильщиком памяти (оптимизаторами) - Программирование Android
Пытаюсь повторить программу https://play.google.com/store/apps/details?id=com.urbandroid.inline Простая системная флай-панелька с...

Выделение памяти оператором new - Visual C++
Добрый день!Я пишу функцию которая считывает в память рисунок и заполняет массив значениями цвета пикселов...но при выделении памяти для...


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

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

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