С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,615

Усовершенствование класса для "трассировки" утечек памяти AutoCounter

07.06.2021, 15:27. Показов 323. Ответов 0

Студворк — интернет-сервис помощи студентам
В книге предлагается усовершенствовать класс с AutoCounter, как-то так
Измените класс C16:AutoCounter.h из первого тома так, чтобы он стал дей­ствительно полезным средством отладки. Он должен использоваться в ка­честве вложенного члена каждого класса, который вы планируете трассиро­вать. Оформите AutoCounter в виде шаблона, параметризованного по имени внешнего класса. Во всех сообщениях об ошибках выводите имя класса сред­ствами RTTI.
класс AutoCounter, до:
Кликните здесь для просмотра всего текста
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
#ifndef AUTOCOUNTER_H
#define AUTOCOUNTER_H
 
#include"../require.h"
#include<iostream>
#include<set>
#include<string>
 
class AutoCounter
{
    public:
    //Объекты могут создаваться только так
        static AutoCounter* create()
        {
            return new AutoCounter();
        }
        
        ~AutoCounter()
        {
            std::cout << "destroying[" << id << "]" << std::endl;
            verifier.remove(this);
        }
        
        //Вывод объекто и указателей
        
        friend std::ostream& operator<<(std::ostream& os, const AutoCounter& a)
        {
            return os << "AutoCounter " << ac.id;
        }
        
        friend std::ostream& operator<<(std::ostream& os, const AutoCounter* a)
        {
            return os << "AutoCounter " << ac->id;
        }
    private:
        static int count;
        int id;
        
        class CleanupCheck
        {
            public:
                void add(AutoCounter* ap)
                {
                    trace.insert(ap);
                }
                
                void remove(AutoCounter* ap)
                {
                    require(trace.erase(ap) == 1, "Attempt to delete AutoCounter twice");
                }
                
                ~CleanupCheck()
                {
                    std::cout << "~CleanupCheck()" << std::endl;
                    require(trace.size() == 0, "All AutoCounter objects not cleaned up");
                }
            private:
                std::set<AutoCounter*> trace;
        };
        static CleanupCheck verifier;
        AutoCounter():id(count++)
        {
            verifier.add(this); //Register itself
            std::cout << "created[" << id << "]" << std::endl;
        }
        
        //Запретить присваивание и конструктор копирования
        AutoCounter(const AutoCounter&);
        AutoCounter operator=(const AutoCounter&);
};
 
#endif 
 
//AutoCounter.cpp
#include "AutoCounter.h"
 
AutoCounter::CleanupCheck AutoCounter::verifier; //что за инициализация такая хитрая.
int AutoCounter::count = 0;



Усовершенствования это что-то вроде этого:
Кликните здесь для просмотра всего текста
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
#ifndef AUTOCOUNTER_H
#define AUTOCOUNTER_H
 
#include"../_eckel/recuire.h"
#include<iostream>
#include<set>
#include<string>
#include<typeinfo>
 
template<typename T>
class AutoCounter
{
public:
    //Объекты могут создаваться только так
    static AutoCounter<T>* create()
    {
        return new AutoCounter<T>();
    }
 
    ~AutoCounter()
    {
        std::cout << "destroying[" << id << "]" << std::endl;
        verifier.remove(this);
    }
 
    //Вывод объектов и указателей
    template<typename T>
    friend std::ostream& operator<<(std::ostream& os, const AutoCounter<T>& a)
    {
        return os << "AutoCounter " << a.id << '\t' << typeid(a.className);
    }
 
    template<typename T>
    friend std::ostream& operator<<(std::ostream& os, const AutoCounter<T>* a)
    {
        return os << "AutoCounter " << a->id << '\t' << typeid(a->className);
    }
private:
    static int count;
    int id;
    T className;
    class CleanupCheck
    {
    public:
        void add(AutoCounter* ap)
        {
            trace.insert(ap);
        }
 
        void remove(AutoCounter* ap)
        {
            require(trace.erase(ap) == 1, "Attempt to delete AutoCounter twice");
        }
 
        ~CleanupCheck()
        {
            std::cout << "~CleanupCheck()" << std::endl;
            require(trace.size() == 0, "All AutoCounter objects not cleaned up");
        }
    private:
        
        std::set<AutoCounter*> trace;
    };
 
    static CleanupCheck verifier;
    AutoCounter() :id(count++)
    {
        verifier.add(this); //Register itself
        std::cout << "created[" << id << "]" << std::endl;
    }
 
    //Запретить присваивание и конструктор копирования
    AutoCounter(const AutoCounter&);
    AutoCounter& operator=(const AutoCounter&);
};
 
 
template<typename T>
int AutoCounter<T>::count = 0;
 
#endif
//......

Получается, что этот класс, по сути, является абстрактным, тогда как создаваться объекты внутри других классов, которые собираешься трассировать?! Возможно ли и правильно ли поступить так, вынести конструктор по умолчанию в открытую область класса. Если параметризируется по типу класса, возможно, стоит удалить static int count и int id, если предлагается в отладочный вывод включать имя объекта/класса?

Добавлено через 1 час 28 минут
Хз... Но, думаю, вопрос можно удалять.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.06.2021, 15:27
Ответы с готовыми решениями:

Тулза для поиска утечек памяти
Прога, написанная мною, сильно тормозит. Скорее всего имеются утечки памяти. Подскажите какую-нибудь тулзу для поиска утечек памяти в коде,...

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

Обнаружение утечек памяти в Visual Studio (для экспертов С++)
Тестирую разные методы обнаружение утечек памяти. Для начала делаю это на простом коде: int x = 7; int* p = new int; p = &amp;x; ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2021, 15:27
Помогаю со студенческими работами здесь

Перехват функций malloc/free для поиска утечек памяти
Необходимо написать программу, которая перехватывает данные функции и ищет утечки в памяти. Заранее благодарю за помощь

Тема утечек памяти
Всем привет. Прошу проконсультировать по поводу утечек памяти, а именно, когда утекает Активити. У меня есть Активность, презентер, и...

Обнаружение утечек памяти
Существуют ли какие-нибудь средства позволяющие отлаживать ошибки, вызванные утечками памяти? Добавлено через 27 минут Как я понял...

Обнаружение утечек памяти
в общем есть большой проект, изначально не мой. решил проверить весь код на утечки, подключил отлов: #ifdef _DEBUG #define...

Устал от утечек памяти
С этими утечками памяти в C++ просто беда. Посоветуйте, что можно сделать? Может быть есть какие-то специальные утилиты?


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru