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

C++

Войти
Регистрация
Восстановить пароль
 
ZZZZZZZZ
3 / 3 / 1
Регистрация: 25.12.2012
Сообщений: 51
#1

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

12.04.2015, 23:05. Просмотров 447. Ответов 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 указателя, но где?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2015, 23:05     Почему valgrind показывает утечку?
Посмотрите здесь:

почему не показывает результат в консоле? - C++
#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++ не показывает русские буквы - C++
Вот такая программа(код) // rrrrrrrr.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include...

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

показывает ошибку в `pow`, почему?и как это исправить? - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class myClass { double a; public: double b; void...

Почему Visual Studio показывает ошибку, но программа компилируется и работает? - C++
template &lt;typename T&gt; struct MyType { friend std::ostream &amp;operator&lt;&lt;(std::ostream &amp;out, const MyType&lt;T&gt; &amp;object) { out &lt;&lt;...

Почему Visual Studio показывает ошибку в том месте, где ее нет? - C++
Почему Visual Studio показывает ошибку в том месте, где ее нет?

Вывод списка категорий интерфейсов не соответствует тому, что показывает утилита OleView, почему? - C++ COM
Вот код, за основу взят код Роджерсона из его главы 6, я всё поупрощал донельзя, все проверки поубирал: #include &lt;stdio.h&gt; #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
13.04.2015, 05:57     Почему valgrind показывает утечку? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
  BigFloat<10,10> *sqrt2 = new BigFloat<10,10>("1.4142");
  delete sqrt2 ;
DrOffset
6918 / 4111 / 939
Регистрация: 30.01.2014
Сообщений: 6,905
13.04.2015, 08:55     Почему valgrind показывает утечку? #3
Цитата Сообщение от ZZZZZZZZ Посмотреть сообщение
end_of_number_
А куда у тебя end_of_number_ из членов класса пропал? )
Как раз содержимое класса и течет. Два пойнтера + size_t.
ZZZZZZZZ
3 / 3 / 1
Регистрация: 25.12.2012
Сообщений: 51
13.04.2015, 10:07  [ТС]     Почему valgrind показывает утечку? #4
А куда у тебя end_of_number_ из членов класса пропал? )
Не очень понял.
А вот так действительно чистит все, срабатывает деструктор и удаляются указатели
delete sqrt2;
Возможно ли в данном случае написать это как-то иначе, вызовом только деструктора, без непосредственного вызова delete? Хотя, похоже, что нет, так как я создаю именно указатель на класс и деструктор чистит только эту часть памяти (содержимое класса).
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
13.04.2015, 11:23     Почему valgrind показывает утечку? #5
Цитата Сообщение от ZZZZZZZZ Посмотреть сообщение
вызовом только деструктора, без непосредственного вызова delete?
Наоборот. delete сам вызовет деструктор.
DrOffset
6918 / 4111 / 939
Регистрация: 30.01.2014
Сообщений: 6,905
13.04.2015, 12:35     Почему valgrind показывает утечку? #6
Цитата Сообщение от 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_ - нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2015, 16:31     Почему valgrind показывает утечку?
Еще ссылки по теме:

Valgrind - C++ Linux
Нужна помощь в Valgrind кто кто знает помогите консультацией Поиск утечек памяти Профилирование {Deleted} П. 5.18 и 5.19 Правил ...

Непонятки с Valgrind - C++ Linux
Проверяю свою программу с помощью Valgrind, через терминал Ubuntu. На выходе мне много ошибок и сообщения об утечках памяти, но ссылки на...

Valgrind и отладка приложения - C++ Linux
Необходимо отладить приложение. Во время работы (при компиляции в режиме отладки) приложение грузит проц на ~5%. Запускаю в valgrind'е -...

ошибка программы. расшифровать gdb и valgrind - C++
подскажите пожалуйста в чем мб трабла? /******************************gbd***************************/ Program received signal...

Найти утечку памяти - C++ Builder
Приветствую всех! Много раз слышал, что с помощью CodeGuard можно проверить есть ли в приложении утечка памяти. Подскажите, как это сделать?


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

Или воспользуйтесь поиском по форуму:
ZZZZZZZZ
3 / 3 / 1
Регистрация: 25.12.2012
Сообщений: 51
13.04.2015, 16:31  [ТС]     Почему valgrind показывает утечку? #7
Да, точно, забыл ее тут подписать, она в public. Извиняюсь
Yandex
Объявления
13.04.2015, 16:31     Почему valgrind показывает утечку?
Ответ Создать тему
Опции темы

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