Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В цехе по разливу напитков работают два конвейера https://www.cyberforum.ru/ cpp-beginners/ thread1500093.html
В цехе по разливу напитков работают два конвейера. На первом конвейере напиток разливается по бутылкам, а на втором происходит закупоривание бутылок. После схода с первого конвейера очередной бутылки она сразу же поступает на второй. Поскольку используется различная тара, то каждая бутылка имеет свое время заполнения и время закупорки. Необходимо разработать приложение, позволяющее моделировать...
Бесконечный цикл при работе с бинарным деревом C++
Добрый вечер. Помогите разобраться на третьем обьекте в бинарном дереве ухожу в бесконечный цикл. Где я допустил ошибку ? #include <iostream> #include <iomanip> #include <time.h> #include <string> using namespace std; class Node
C++ Доработать код: возвести числа в степень, после сравнить полученные данные и найти большее https://www.cyberforum.ru/ cpp-beginners/ thread1500063.html
//программа должна считывать данные с клавиатуры и возводить числа в степень, //после сравнить полученные данные и найти большее #include <iostream> #include <cmath> using namespace std; void zxc(float a,float b){ float d=pow(a,b); cout<<endl; cout<<a<<" w stepeni "<<b<<"="<<d<<endl;
C++ Что еще можно параллельно изучать вместе с С++? https://www.cyberforum.ru/ cpp-beginners/ thread1500023.html
Сейчас изучаю С++ по Дейтелам. Собственно, насколько я понимаю, программист - это не только знание ЯП"ов. Что еще можно параллельно изучать? Мне нужно как-то разбавлять один С++ чем то еще. Хотел бы в дальнейшем работать с комп. сетями, правда пока не представляю, что там будет. В общем, прошу помочь в этом вопросе. Добавлено через 6 минут в заголовке темы чуть накосячил, но думаю, что суть...
Ошибка: 'else' without a previous 'if' C++
Не понимаю почему в 17 строчке ошибка: C:\Users\flagship\Documents\6.1.cpp 'else' without a previous 'if' У меня нет никаких лишних операторов между if и else #include<iostream> #include<cctype> using namespace std; int main() { char ch; cin.get(ch);
C++ Можно ли задать такие параметры, чтоб в функции произошла ошибка? https://www.cyberforum.ru/ cpp-beginners/ thread1499997.html
class TMatrix; class TVector { public: double x; double y; double z; TVector operator * (const TMatrix &Turn); TVector operator * ( double k ); };
C++ Какие есть библиотеки для распаковки zip файлов? Какие есть варианты библиотек для c++ чтобы распаковывать zip? Конкретно у меня компилятор MinGW. Как понимаю, в нем "родной" такой в принципе нет, нужно ставить? Знаю про библиотеку zlib но хочу еще варианты https://www.cyberforum.ru/ cpp-beginners/ thread1499996.html Задача из книги Дейтлов: напечатать таблицу двоичных, восьмеричных и шестнадцатиричных чисел C++
Уважаемые форумчане помогите разобраться с задачей. Напишите программу, которая печатает таблицу двоичных, восьмеричных и шестнадцатиричных эквивалентов десятичных чисел в диапазоне от 1 до 256. C двоичной и восьмеричной разобрался, а вот с 16-й никак не выходит. В распоряжение только операторы ввода/вывода и управляющие операторы. #include "stdafx.h" #include <iostream>
C++ Создание лог файла. Нет подходящего конструктора по умолчанию Добрый день, почему вылетает ошибка не пойму. Ошибка: нет подходящего конструктора по умолчанию. И вторая ошибка Log::Log(void): перегруженная функция-член не найдена в "Log" вот код #ifndef LOG_H #define LOG_H https://www.cyberforum.ru/ cpp-beginners/ thread1499930.html C++ Комбинация клавиш ALT+TAB C++ Требуется чтобы программа несколько раз переключилась между открытыми окнами (ALT+TAB). По отдельности клавиши ALT и TAB "нажимаются", но вместе эффекта 0. Пожалуйста подскажите, что не так, и, что нужно сделать, чтобы было так. Заранее благодарен. #include <iostream> #include <Windows.h> #include <conio.h> int main() { INPUT alt, tab; https://www.cyberforum.ru/ cpp-beginners/ thread1499926.html
C++ Лексикографическое сравнение. Сортировка строк по алфавиту
Как отсортировать двумерный массив в лексикографическом порядке в меньшую сторону. (Строки содержат только латинские буквы) vlad kostya anya Получаем anya
C++ Не работает вычисление процентов Написать программу, которая обрабатывает результаты эк¬замена. Для каждой оценки программа должна вычислить про¬цент от общего количества оценок. Рекомендуемый вид экрана во время работы программы приведен ниже. Данные, введенные пользователем, выделены полужирным шрифтом. вывод вот такой ..не получаются проценты... не пойму с чем связать пятерок -> 12 четверок -> 10 троек -> 7 двоек ->... https://www.cyberforum.ru/ cpp-beginners/ thread1499910.html
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.07.2015, 14:17 0

Стратегия выделения/освобождения памяти - C++ - Ответ 7882976

17.07.2015, 14:17. Показов 2873. Ответов 23
Метки (Все метки)

Ответ

Цитата Сообщение от Tulosba Посмотреть сообщение
Это потому что у тебя общее владение (shared_ptr), а не эксклюзивное (unique_ptr).
это не принципиально.

Цитата Сообщение от Tulosba Посмотреть сообщение
При этом освобождение осуществляет не тот кто создавал, а последний, кто использует.
это техническая сторона самого смартпоинтера.
но в данном случае, это так же не принципиально.

потому что, это никак не мешает фабрике
(менеджеру, ядру системы, тому, кто выдает интерфейс управления ресурсом)
монопольно контролировать время жизни ресурсов.

мы легко можем:
1. полностью запретить уничтожение ресурса вызывающей стороной.

2. в случае, если снаружи ресурс больше не нужен,
то мы можем не уничтожать его, а просто отложить в сторонку с пометкой "ресурс своден".

3. продливать жизнь ресурса, когда на него больше не ссылается ни один потребитель.

допустим, в этот самый момент времени в системном потоке идет обработка всех ресурсов ядра.
в этот момент нельзя физически уничтожать ресурсы.

тогда в случае, когда последний внешний потребитель отказывается от ресурса,
система автоматически получает сигнал:
"ресурс больше никому не нужен",
он помечается как "свободный".
конвейер его пропустит.
а по завершению работы конвейера можно либо удалить ненужный ресурс, либо см пункт 2.

в общем, все зависит от потребностей задачи.

а суть простая:
внешняя сторона имеет доступ к интерфейсу (функционалу) ресурса,
но она им не владеет: не контролирует время его жизни.

что бы было понятнее, проиллюстрирую этот момент:

http://rextester.com/UWJJU90090

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <iostream>
#include <cassert>
#include <string>
#include <memory>
#include <map>
 
//--- интерфейс ресурса
struct IImage
{
    virtual ~IImage(){}
    virtual const char* AboutMe()const = 0;
};
 
// --- ресурс
struct Png: IImage
{
    Png() { std::cout<<"Png was created\n";   }
   ~Png() { 
std::cout<<"Png was destroyed\n"; 
}
    virtual const char* AboutMe()const { return "PNG"; }
};
 
// --- ресурс
struct Custom: IImage
{
    Custom() { std::cout << "Custom was created\n";   }
   ~Custom() { std::cout << "Custom was destroyed\n"; }
    virtual const char* AboutMe()const { return "Custom"; }
};
    
// --- ядро системы, контролирует ресурсы
struct Core
{
    typedef std::shared_ptr<IImage>
        Image;
    
    // --- подсистемы обычно - сингелтоны
    // данный метод не оч красиво оформлен
    // но для данной иллюстрации сойдет
    static Image Load(const char* filename)
    {
        static Core c;
        return c.CreateResource(filename);
    }
private:    
    typedef std::shared_ptr<IImage>
        Res;
    typedef std::map<Res, bool>    
        Resources;
 
    ~Core()
    {
        // --- при уничтожении системы, 
        // она сама позаботится о своих оставшихся ресурсах
        // и никто, кроме неё не знает, 
        // как это правильно сделать.
        // и вообще, не должен об этом думать
        std::cout<<"[SYSTEM] list resources:\n";
        for(const auto& i: mResources)
            std::cout
                << " [RESOURCE] " << i.first->AboutMe()
                << " : status = " << (i.second? "enabled\n" : "disabled\n");
 
        std::cout<<"[SYSTEM] deactivate...\n";
    }
    
    Image CreateResource(const char* filename)
    {
        // --- обратите внимание:
        // смарт, который получает вызывающая сторона 
        // не контролирует время жизни ресурса
        // пользователю будет доступен интерфейс ресурса
        // но он никак не сможет уничтожить сам ресурс 
        // в обход системы, которая на самом деле
        // является единственным (монопольным) 
        // владельцем ресурса.
 
        // когда снаружи у смартов не останется потребителей
        // то последний оставшийся в живых просигналит системе
        // о том, что ресурс снаружи больше никому не нужен
        // дальнейшая судьба ресурса полностью на усмотрение самой системы
        // в данном примере-иллюстрации система не будет уничтожать ресурсы
        // а будет лишь помечать их как "освободившиеся".
 
        // функтор будет запущен внешними смартами,
        // когда у ресурса не останется потребителей
        // запуск функтора будет сигналом о том, 
        // что ресурс можно освободить
        const auto deletter 
            =  [this](IImage* res){ Free(res); };
 
        // физически ресурс живет в потрохах системы
        // и не допступен снаружи
        const auto pair_ 
            = mResources.emplace(std::move(Make(filename)), true);
 
        const auto& res 
            = pair_.first->first;
        
        std::cout<<"[SYSTEM] create resource: '" 
            << res->AboutMe() <<"'\n";
 
        // выдаваемый наружу смарт может лишь 
        // предоставить доступ к интерфейсу ресурса
        // но не контролирует время жизни самого ресурса
        // он лишь просигналит системе о том, 
        // что у ресурса больше нет потребителей
        return Image(res.get(), deletter);
    }
 
    // захват реального ресурса.
    // приватный метод, только для служебного пользования
    static Res Make(const char* filename)
    {
        const std::string file = filename;
        if(file.find(".png") != std::string::npos)
            return Res(new Png); 
 
        return Res(new Custom); 
    }
    
    // только для служебного пользования
    // когда смарт снаружи просигналит об отсутствии потребителей
    // запуститься этот метод
    void Free(IImage* res)
    {
        std::cout
            << "[SYSTEM] detected free resource: '"
            << res->AboutMe()<<"'\n";
        
        // здесь мы можем сделать с ресурсом все, что захотим.
        // можем убить его. или переиспользовать.
        // зависит от задачи и от фантазии.
 
        // в данном примере, 
        // ресурс просто помечается как "не занятый".
        Res key(res, [](IImage*){});
        auto it = mResources.find(key);
        assert(it!=mResources.end());
        it->second = false;
    }
    
    Resources mResources;
    
};
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    
    // грузим png
    const auto bitmap1 = Core::Load("example.png");
    std::cout<<"resource = "<< bitmap1->AboutMe() << std::endl;
    
    // грузим custom
    const auto bitmap2 = Core::Load("example.custom");
    std::cout<<"resource = "<< bitmap2->AboutMe() << std::endl;
    
    std::cout<<"[Work completed] expect to release all resources...\n";
    
}

резюмируя: смарт-поинтеры - это больше чем просто способ контроля за утечками памяти.

это - мощный паттерн,
позволяющий детально контролировать время жизни и права доступа ресурсов.

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

однако, с точки зрения архитектуры,
владеет и контролирует время жизни ресурса именно тот, кто его создавал.

а не "механизм shared_ptr, который держит указатель на аллоцированный объект".

shared_ptr - всего лишь пешка в этой игре,
чьими руками предоставляется доступ к ресурсу.

Вернуться к обсуждению:
Стратегия выделения/освобождения памяти C++
12
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2015, 14:17
Готовые ответы и решения:

Нюансы выделения и освобождения памяти (структуры)
struct point { int a; point *next; } point *p=new point Я освобожу всю память которая...

Функциии динамического выделения и освобождения памяти
Необходим написать функции выделения и освобождения памяти под двумерный динамический массив....

Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода
Напишите функции: 1) выделяющую память для массива данных типа float, 2) заполняющую ячейки...

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

23
17.07.2015, 14:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2015, 14:17
Помогаю со студенческими работами здесь

Указатель после освобождения памяти
Стивен Прата, глава 4, раздел &quot;Освобождение памяти с помощью операции delete&quot; Я пытаюсь понять....

Деструкторы, аналоги освобождения памяти
Доброго времени суток. Возник следующий вопрос. Какие, помимо деструкторов, способы очистки памяти...

Не понимаю логики освобождения памяти
Не могу понять каким образом освобождается память если ее ячейки всеравно заполнены, и более того...

Ошибка освобождения памяти new/delete
При выполнении оператора deleterez вылетает ошибка BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse) ...

Проверка освобождения памяти (new, delete)
Всем привет. Программы помаленьку становятся сложнее. Появляются самодельные контейнеры внутри...

Переполнение стека во время освобождения памяти
Здравствуйте! СТолкнулся с такой проблемой, что при работе деструктора программа аварийно...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru