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

C++

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

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

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

Про деструктор и утечку памяти - C++
Доброе время суток. Вот что дано: #include &lt;string&gt; #include &lt;vector&gt; class Symbols { protected: void add(std::string...

Изолировать утечку памяти - C++ Builder
Есть давний проект. В нем есть утечка памяти. Разобраться с самой утечкой - долго, там, судя по отзывам в сети, проблемы у компилятора. ...

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

Как найти и устранить утечку памяти - C++ Builder
Программа в ходе ее выполнения разрастается. Я не могу найти где именно происходит утечка. В Unit1 обрабатываются события двух кнопок. Одна...

Как победить утечку памяти? DDE - C++ WinAPI
Мне нужно получить данные от DDE сервера. Где-то на 16000 проходе цикла, я получаю кракозябры. Visual Studio 2010 Экспресс-выпуск, windows...

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

6
Croessmah
Эксперт CЭксперт С++
13420 / 7574 / 855
Регистрация: 27.09.2012
Сообщений: 18,649
Записей в блоге: 3
Завершенные тесты: 1
13.04.2015, 05:57 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
  BigFloat<10,10> *sqrt2 = new BigFloat<10,10>("1.4142");
  delete sqrt2 ;
1
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
13.04.2015, 08:55 #3
Цитата Сообщение от ZZZZZZZZ Посмотреть сообщение
end_of_number_
А куда у тебя end_of_number_ из членов класса пропал? )
Как раз содержимое класса и течет. Два пойнтера + size_t.
1
ZZZZZZZZ
3 / 3 / 1
Регистрация: 25.12.2012
Сообщений: 51
13.04.2015, 10:07  [ТС] #4
А куда у тебя end_of_number_ из членов класса пропал? )
Не очень понял.
А вот так действительно чистит все, срабатывает деструктор и удаляются указатели
delete sqrt2;
Возможно ли в данном случае написать это как-то иначе, вызовом только деструктора, без непосредственного вызова delete? Хотя, похоже, что нет, так как я создаю именно указатель на класс и деструктор чистит только эту часть памяти (содержимое класса).
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
13.04.2015, 11:23 #5
Цитата Сообщение от ZZZZZZZZ Посмотреть сообщение
вызовом только деструктора, без непосредственного вызова delete?
Наоборот. delete сам вызовет деструктор.
1
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
13.04.2015, 12:35 #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_ - нет.
0
ZZZZZZZZ
3 / 3 / 1
Регистрация: 25.12.2012
Сообщений: 51
13.04.2015, 16:31  [ТС] #7
Да, точно, забыл ее тут подписать, она в public. Извиняюсь
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2015, 16:31
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
13.04.2015, 16:31
Ответ Создать тему
Опции темы

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