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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
infobos
Строитель
354 / 67 / 1
Регистрация: 18.06.2010
Сообщений: 503
#1

Выделение памяти, проверка на утечку памяти - C++

11.03.2017, 07:06. Просмотров 368. Ответов 3
Метки нет (Все метки)

Интересуют два вопроса:

1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые способы?

2. Как проверить удаляется ли выделение памяти в среде Visual Studio? Я про то, что коды могут быть очень большими и не всегда есть возможность посмотреть каждую переменную. Может, есть способ увидеть память программы целиком? Знаю, что можно отследить в диспетчере задач посмотрев на процесс. Но там не возможно посмотреть с точностью до байтов…

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
#include <iostream>//Библиотека ввода вывода
//Консольное приложение для теста массива указателей с выделением памяти.
 
void main()
{
    setlocale(LC_ALL, "rus");
 
    //Тест на работу строк
    std::cout << "\n";
    std::cout << "Новый тест\n";
 
    char mas[10];
    char *text;
    int adres;
 
    text="Привет";
    adres=(int)text;
 
    strcpy_s(mas, 10, "123");
 
    std::cout << text << "\n";
    std::cout << mas << "\n";
    std::cout << adres << "\n";
    printf("%X\n", adres);
 
 
 
    //Тест на массив указателей
    setlocale(LC_ALL, "rus");
 
    std::cout << "\n";
    std::cout << "Новый тест 2\n";
 
    int **masmas;
    int kol=10;
    int f,f2;
 
    masmas = new int*[kol];
    for (f=0;f<kol;f++)
    {
        masmas[f]=new int[kol];
        
        for (f2=0;f2<kol;f2++) {masmas[f][f2]=(f*10)+f2;};//Записать ячейку
    }
 
    //Показать запись
    for (f=0;f<kol;f++)
    {
        for (f2=0;f2<kol;f2++) {std::cout << masmas[f][f2] << "\n";};
    }
 
 
    for (int i=0;i<kol;i++) {delete[] masmas[i];}//Удалить вложенный массив
    delete[] masmas;//Удалить главный массив
 
 
    int s3;
    std::cin>>s3;
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2017, 07:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти, проверка на утечку памяти (C++):

Проверка на утечку памяти - C++
Всем доброго времени суток. Сразу оговорюсь, я не профессионал, программирование - моё хобби, которое помогает мне по основному...

Найти утечку памяти программно - C++
Есть программа (под 700 строк) в которой есть утечка памяти в размере, с помощью чего можно потестировать программку чтобы их найти? Знаю в...

Как отследить утечку памяти? - C++
Как в vs(ну или в общем) отследить учтечку памяти? То есть если было выделено память под что то с помощь new и по каким то причинам не было...

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Программа для проверки кода на утечку памяти. - C++
Есть код на С++, нужно проверить течет ли память. С помощью какой программы это можно сделать?

Как можно специально организовать утечку памяти? - C++
Всем привет! А как можно специально организовать утечку памяти? Можно - ли таким способом? int size; cin &gt;&gt; size; int...

3
nmcf
5544 / 4854 / 1647
Регистрация: 14.04.2014
Сообщений: 19,710
11.03.2017, 07:32 #2
Цитата Сообщение от infobos Посмотреть сообщение
Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти?
Да.
Цитата Сообщение от infobos Посмотреть сообщение
Может быть, есть более простые способы?
std::vector
1
Notoriously
68 / 68 / 24
Регистрация: 06.07.2016
Сообщений: 406
11.03.2017, 10:52 #3
infobos,
Для поиска утечек пользуюсь этим - https://msdn.microsoft.com/ru-ru/library/x98tx3cf.aspx
Учтите, что объекты-контейнеры деструктор для которых вызовется лишь при полном завершении программы также будут считаться утечками (как раз эти самые std :: string), поэтому не удивляйтесь.
А конкретно во время исполнения следить за каждым байтиком в VS 2015 вроде бы можно, но такого давно не делал.
1
infobos
Строитель
354 / 67 / 1
Регистрация: 18.06.2010
Сообщений: 503
11.03.2017, 15:17  [ТС] #4
Цитата Сообщение от Notoriously Посмотреть сообщение
Для поиска утечек пользуюсь этим - https://msdn.microsoft.com/ru-ru/library/x98tx3cf.aspx
Учтите, что объекты-контейнеры деструктор для которых вызовется лишь при полном завершении программы также будут считаться утечками (как раз эти самые std :: string), поэтому не удивляйтесь.
А конкретно во время исполнения следить за каждым байтиком в VS 2015 вроде бы можно, но такого давно не делал.
А можно пример кода? Чтобы в коде была утечка памяти и ее выявить с помощью библиотеки <crtdbg.h>
Интересует измерять оперативную память в коде на разных строках кода.

Добавлено через 16 минут
Спасибо! Разобрался! Работает на visual studio 2012
Вот тема: Борьба с утечками памяти
Вот мой рабочий код:
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
#include "Global.h"
 
#include <crtdbg.h>//Библиотека для утечки памяти
_CrtMemState  stady1 = {0};//Результат памяти 1
_CrtMemState  stady2 = {0};//Результат памяти 2
 
 
void main()
{
 
      _CrtMemCheckpoint( &stady1 ); //Результат памяти 1
   
 
    setlocale(LC_ALL, "rus");
 
    prrint();
 
    std::cout << "\n";
    std::cout << "Новый тест 2\n";
 
    int **masmas;
    int kol=2;
    int f,f2;
 
    masmas = new int*[kol];
    for (f=0;f<kol;f++)
    {
        masmas[f]=new int[kol];
        
        for (f2=0;f2<kol;f2++) {masmas[f][f2]=(f*kol)+f2;};//Записать ячейку
    }
 
    //Показать запись
    for (f=0;f<kol;f++)
    {
        for (f2=0;f2<kol;f2++) {std::cout << masmas[f][f2] << "\n";};
    }
 
 
    for (int i=0;i<kol;i++) {delete[] masmas[i];}//Удалить вложенный массив
    delete[] masmas;//Удалить главный массив
 
    //Выявить утечку памяти
    _CrtMemCheckpoint( &stady2 );//Результат памяти 2
    _CrtMemState  result = {0};
   if( _CrtMemDifference( &result, &stady1, &stady2 ) )  {
         _CrtMemDumpStatistics( &result );
         printf("Память изменилась: %u\n", result.lTotalCount);
   }else printf("Утечки памяти нет!\n");
   //Выявить утечку памяти
 
    std::cout << "\n";
    std::cout << "Новый тест 3\n";
 
    Sum k,z;
    Sum *r;
 
    r=&z;
    r->getx(2);
 
    k.getx(2);
    k.gety(3);
 
    k.summa();
 
    int s3;
    std::cin>>s3;
 
}
0
11.03.2017, 15:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2017, 15:17
Привет! Вот еще темы с ответами:

Прошу отследить утечку памяти, если оная есть - C++
Изучаю c++ на стадии полиморфизма, решил написать инвентарь (потренироваться) ну и возник вопрос касательно создания копии. Код: ...

Выделение памяти - C++
Скажите пожалуйста что не так? Не могу получить доступ к элементу str = 12, stlb = 3 bool** tempValues = new(bool*); for(int i = 0;...

Выделение памяти - C++
Добрый вечер. Немогу никак понять некоторые тонкости выделения памяти. Во первых: на что указывает указатель, при записи char*...

Выделение памяти (new) - C++
Наткнулся на пример где делают непонятные мне выделения памяти с помощью new X* pi = new X; X* p2 = new X ; X* рЗ = new (&amp;buffer )...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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