С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
3 / 3 / 1
Регистрация: 25.12.2012
Сообщений: 51

Почему valgrind показывает утечку?

12.04.2015, 23:05. Показов 3227. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,
Вот кусочек шаблона и чуть-чуть функции main
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
template < size_t precision_T, size_t base_T >
class BigFloat {
  public:
    BigFloat(const char *source);
    ~BigFloat();
  private:
    int *buf_;
    int *exp_;
    int findNum(const char symbol);
};
 
template < size_t precision_T, size_t base_T >
int BigFloat< precision_T, base_T >::findNum(const char symbol) {
  char reg[] = {'0','1','2','3','4','5','6','7','8','9'};
  int j = 0;
  while (symbol != reg[j] && j < 10) {
    j++;
  }
  if (j == 10)
    assert(!"Unknown character!");
  return j;
}
 
template < size_t precision_T, size_t base_T >
BigFloat< precision_T, base_T >::BigFloat(const char *source) :
  end_of_number_(0),
  buf_(new int[precision_T]),
  exp_(new int[precision_T])
{
  int length = strlen(source);
  int k = 0;
  while (source[k] != '.' && k < length) {
    exp_[0] *= base_T;
    exp_[0] += findNum(source[k]);
    k++;
  }
  length--;
  for (int i = k; i < precision_T; i++) {
    exp_[i] = 0;
    buf_[i] = 0;
    if (i < length) {
      k++;
      if (i != 0)
        exp_[i] = findNum(source[k]);
      end_of_number_ = i;
    }
  }
}
 
template < size_t precision_T, size_t base_T >
BigFloat< precision_T ,base_T >::~BigFloat() {
  delete [] exp_;
  delete [] buf_;
  exp_ = NULL;
  buf_ = NULL;
  end_of_number_ = 0;
}
 
int main() {
  BigFloat<10,10> *sqrt2 = new BigFloat<10,10>("1.4142");
  sqrt2->~BigFloat();
}
Вроде как я уничтожаю объект класса, и вроде как освобождаю всю память, которую я использовал, но valgrind говорит вот что.
==8350== Memcheck, a memory error detector
==8350== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==8350== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==8350== Command: ./v2
==8350==
==8350==
==8350== HEAP SUMMARY:
==8350== in use at exit: 24 bytes in 1 blocks
==8350== total heap usage: 3 allocs, 2 frees, 104 bytes allocated
==8350==
==8350== 24 bytes in 1 blocks are definitely lost in loss record 1 of 1
==8350== at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8350== by 0x4007F1: main (v2.cpp:371)
==8350==
==8350== LEAK SUMMARY:
==8350== definitely lost: 24 bytes in 1 blocks
==8350== indirectly lost: 0 bytes in 0 blocks
==8350== possibly lost: 0 bytes in 0 blocks
==8350== still reachable: 0 bytes in 0 blocks
==8350== suppressed: 0 bytes in 0 blocks
==8350==
==8350== For counts of detected and suppressed errors, rerun with: -v
==8350== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Не понимаю, где же, собственно утечка? Раз пишет, что 24 байта, то предполагаю, что это 3 указателя, но где?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.04.2015, 23:05
Ответы с готовыми решениями:

почему не показывает результат в консоле?
#include &lt;iostream&gt; #include &lt;сtime&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;rus&quot;); const int array = 5; ...

Почему MS Visual C++ не показывает русские буквы
Вот такая программа(код) // rrrrrrrr.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; ...

почему то не не показывает числа минимального элемента и суммы
int main(void) { setlocale(LC_ALL, &quot;Russian&quot;); printf(&quot; Кадесников Павел ИНБс-11 &quot;); printf(&quot;\n В одномерном массиве, состоящем...

6
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
13.04.2015, 05:57
Лучший ответ Сообщение было отмечено ZZZZZZZZ как решение

Решение

C++
1
2
  BigFloat<10,10> *sqrt2 = new BigFloat<10,10>("1.4142");
  delete sqrt2 ;
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.04.2015, 08:55
Цитата Сообщение от ZZZZZZZZ Посмотреть сообщение
end_of_number_
А куда у тебя end_of_number_ из членов класса пропал? )
Как раз содержимое класса и течет. Два пойнтера + size_t.
1
3 / 3 / 1
Регистрация: 25.12.2012
Сообщений: 51
13.04.2015, 10:07  [ТС]
А куда у тебя end_of_number_ из членов класса пропал? )
Не очень понял.
А вот так действительно чистит все, срабатывает деструктор и удаляются указатели
delete sqrt2;
Возможно ли в данном случае написать это как-то иначе, вызовом только деструктора, без непосредственного вызова delete? Хотя, похоже, что нет, так как я создаю именно указатель на класс и деструктор чистит только эту часть памяти (содержимое класса).
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.04.2015, 11:23
Цитата Сообщение от ZZZZZZZZ Посмотреть сообщение
вызовом только деструктора, без непосредственного вызова delete?
Наоборот. delete сам вызовет деструктор.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
13.04.2015, 12:35
Цитата Сообщение от ZZZZZZZZ Посмотреть сообщение
Не очень понял.
Цитата Сообщение от ZZZZZZZZ Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
template < size_t precision_T, size_t base_T >
class BigFloat {
  public:
    BigFloat(const char *source);
    ~BigFloat();
  private:
    int *buf_;
    int *exp_;
    int findNum(const char symbol);
};
Ну вот смотри. Ты постишь код. По всем признакам там должно быть три переменные-члена. А у тебя только две. Причем ниже в конструкторе ты ее инициализируешь все-таки.
Цитата Сообщение от ZZZZZZZZ Посмотреть сообщение
C++
1
2
3
template < size_t precision_T, size_t base_T >
BigFloat< precision_T, base_T >::BigFloat(const char *source) :
  end_of_number_(0),
А вот из описания класса она пропала. Конструктор и деструктор - на месте. Функция findNum - на месте. Есть два указателя. А вот переменной end_of_number_ - нет.
0
3 / 3 / 1
Регистрация: 25.12.2012
Сообщений: 51
13.04.2015, 16:31  [ТС]
Да, точно, забыл ее тут подписать, она в public. Извиняюсь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.04.2015, 16:31
Помогаю со студенческими работами здесь

Почему установщик игры показывает объём свободного места на диске больший, чем таковой показывает система?
Доброго времени суток. Такой вопрос - решил поставить игру, которую долго ждал. При выборе места установки выбираю диск D и понятным мне...

Почему то один вопрос всего лишь из списка показывает в тесте, почему?
Тест на проверку знаний. Вопросы берутся из .ini файла зашифрованный смещением xor+2. Шифровальщик прилагается. Почему то один вопрос всего...

Почему то не показывает регионы
Не показывает на картинке регионы, программа запускается но регионы не показывает: unit Unit1; interface uses Windows,...

Почему Яндекс не показывает обратки ?
Подскажите, пожалуйста: есть сайт, ТИЦ у которого 400, но Яндекс почему-то не показывает ни одной обратки, что это может быть ?

Почему скд не показывает столбец
Народ подскажите почем СКД нев какую не хочет показать столбец


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 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 считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru