Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5

Memory leak in the SharedPtr C++98

24.02.2018, 09:34. Показов 2370. Ответов 23

Студворк — интернет-сервис помощи студентам
Стандарт С++98. Задача: реализовать свой SharedPtr (не шаблонный). Всю ночь просидел вылизывая код, но даже сейчас мне приходит отчёт об утечках памяти.

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
#include <map>
 
struct Expression;
 
struct SharedPtr
{
    explicit SharedPtr(Expression *ptr = 0);
    ~SharedPtr();
    SharedPtr(const SharedPtr &);
    SharedPtr &operator=(const SharedPtr &);
    Expression *get() const;
    void reset(Expression *ptr = 0);
    Expression &operator*() const;
    Expression *operator->() const;
 
  private:
    Expression *ptr;
};
 
SharedPtr::SharedPtr(Expression *ptr) : ptr(0) { reset(ptr); }
SharedPtr::~SharedPtr() { reset(0); }
SharedPtr::SharedPtr(SharedPtr const &other) : ptr(0) { reset(other.ptr); }
 
SharedPtr &SharedPtr::operator=(SharedPtr const &other)
{
    reset(other.ptr);
    return *this;
}
 
void SharedPtr::reset(Expression *ptr)
{
    static std::map<Expression *, unsigned> counter;
 
    if (ptr != this->ptr)
    {
        if (this->ptr && --counter[this->ptr] == 0)
            delete this->ptr;
        if ((this->ptr = ptr))
            ++counter[this->ptr];
    }
}
 
Expression *SharedPtr::get() const { return ptr; }
Expression &SharedPtr::operator*() const { return *ptr; }
Expression *SharedPtr::operator->() const { return ptr; }
Интерфейс SharedPtr жестко зафиксирован и я его менять не могу. Я даже запускал valgrind, мол вдруг и впрям что-то да подтекает. Получаю вывод

Code
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
$ valgrind --leak-check=full --show-leak-kinds=all ./run
==30802== Memcheck, a memory error detector
==30802== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==30802== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==30802== Command: ./run
==30802== 
 
==30802== 
==30802== HEAP SUMMARY:
==30802==     in use at exit: 72,704 bytes in 1 blocks
==30802==   total heap usage: 6 allocs, 5 frees, 73,826 bytes allocated
==30802== 
==30802== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1
==30802==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30802==    by 0x4EC3EFF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==30802==    by 0x40106B9: call_init.part.0 (dl-init.c:72)
==30802==    by 0x40107CA: call_init (dl-init.c:30)
==30802==    by 0x40107CA: _dl_init (dl-init.c:120)
==30802==    by 0x4000C69: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==30802== 
==30802== LEAK SUMMARY:
==30802==    definitely lost: 0 bytes in 0 blocks
==30802==    indirectly lost: 0 bytes in 0 blocks
==30802==      possibly lost: 0 bytes in 0 blocks
==30802==    still reachable: 72,704 bytes in 1 blocks
==30802==         suppressed: 0 bytes in 0 blocks
==30802== 
==30802== For counts of detected and suppressed errors, rerun with: -v
==30802== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Но это с учетом того что вывод стандартного "Hello World!" дает 2 allocs, 1 frees.

Подскажите что я упускаю из виду, пожалуйста.

(полная версия, чтобы можно было запустить и "пощупать")
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <map>
 
struct Expression
{
    ~Expression() { std::cout << "Destructor" << std::endl; }
};
 
struct SharedPtr
{
    explicit SharedPtr(Expression *ptr = 0);
    ~SharedPtr();
    SharedPtr(const SharedPtr &);
    SharedPtr &operator=(const SharedPtr &);
    Expression *get() const;
    void reset(Expression *ptr = 0);
    Expression &operator*() const;
    Expression *operator->() const;
 
  private:
    Expression *ptr;
};
 
SharedPtr::SharedPtr(Expression *ptr) : ptr(0) { reset(ptr); }
SharedPtr::~SharedPtr() { reset(0); }
SharedPtr::SharedPtr(SharedPtr const &other) : ptr(0) { reset(other.ptr); }
 
SharedPtr &SharedPtr::operator=(SharedPtr const &other)
{
    reset(other.ptr);
    return *this;
}
 
void SharedPtr::reset(Expression *ptr)
{
    static std::map<Expression *, unsigned> counter;
 
    if (ptr != this->ptr)
    {
        if (this->ptr && --counter[this->ptr] == 0)
            delete this->ptr;
        if ((this->ptr = ptr))
            ++counter[this->ptr];
    }
}
 
Expression *SharedPtr::get() const { return ptr; }
Expression &SharedPtr::operator*() const { return *ptr; }
Expression *SharedPtr::operator->() const { return ptr; }
 
int main()
{
    {
        Expression *ex = new Expression();
        SharedPtr s1(ex);
    }
    {
        Expression *ex = new Expression();
        SharedPtr s2(ex);
        SharedPtr s3 = s2;
        s2 = s3;
        s2.reset(ex);
    }
    std::cout << std::endl;
}
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.02.2018, 09:34
Ответы с готовыми решениями:

memory leak или "ОС подчистит" (Знакомство с Modern C++ Design\Loki Александреску приветствуется)
Доброго времени суток, уважаемые. Возможно мой вопрос покажется вам несколько странным, однако мне бы хотелось внести у себя в голове...

Memory leak
Всем добрый день. Помогите пожалуйста разобраться, проверяю приложение в instruments в leaks и он показывает утечку, но я не пойму где...

Memory leak
Всем добрый день! Господа знатоки, подскажите пожалуйста, столкнулся со следующей проблемой: При помощи API вендора получаю с...

23
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
24.02.2018, 12:28
Студворк — интернет-сервис помощи студентам
outoftime, извиняюсь, пропустил ваше сообщение.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
24.02.2018, 12:29
Warning about "still reachable" memory when using libstdc++ from gcc 5
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
24.02.2018, 13:05  [ТС]
Croessmah, прикол в том, что я не знаю как и чем тестируется код в первом посте.

Не по теме:

я, пока, пойду спать, проснуть буду дальше думать

0
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
24.02.2018, 18:53
Цитата Сообщение от outoftime Посмотреть сообщение
я добавил еще пару строчек для теста и получил ошибку
Потому что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
{
    Expression *ex = new Expression();
    SharedPtr s2(ex);
    SharedPtr s3 = s2;
    s2 = SharedPtr(new Expression());
 
    s3 = s2; // на память по адресу в указателе 'ex' больше никто из объектов
        //не ссылается, соответственно в методе reset она освобождается
 
    s2.reset(ex); // присвоение члену ptr адреса на уже освобождённую память
 
} // при выходе из скопа, деструктор у объекта s2 попытается ещё раз
// освободить память по адресу из указателя 'ex'
Ну а так, прогнал оригинальный код из начального поста в студийном vld, говорит, что никаких утечек не находит. Возможно действительно как-то зависит от компилятора.

Добавлено через 3 минуты
Блин, пропустил и не обратил внимания, что Ygg уже написал здесь почти такой же ответ...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2018, 18:53

Memory leak
Здравствуйте, коллеги. В программе наблюдается утечка памяти. Наблюдается совершенно четко - пользовал CLR Profiler и PerfMon. Код не...

Memory Leak in IE 5.0
Утечка памяти до беспамятства системы :) Замечали такое за ИЕ? Может знает кто в чем дело?

Memory leak
Здравствуйте, столкнулся с такой проблемой. Растет память приложения, причем не сразу, а по событию. Использовал сначала valgrind, но он...

Memory leak
Здравствуйте! Люди, очень интересная проблема возникла у моего друга. Программа считывает с файла данные точек и фэйсов и затем рисует...

memory leak on WM_PAINT
сразу подробный упрощенный пример. на данной машине использую VC6++. Windows NT. но созданный exe на xp ведет себя аналогично. создаем...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru