powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / помогите разобраться с утечками памяти.
25 сообщений из 51, страница 1 из 3
помогите разобраться с утечками памяти.
    #39921436
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
В общем реализовал я динамическую структуру типа кольцо.
гавнокод свой приведу.
Код: plaintext
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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
// ConsoleApplication6.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
#include <iostream>

struct mystruct {
    int x;
    mystruct* Next;

};

void insert(mystruct* item, int index, int  value) {
    mystruct* Current = item;
    int i = 1;
    while (!(Current->Next == item || i == index)) {
        Current = Current->Next;
        i++;
    } 
    
    mystruct* Newitem = new mystruct;
    Newitem->x = value;
    Newitem->Next = Current->Next;
    Current->Next = Newitem;


    std::cout << i<< std::endl;

}

mystruct* deleteitem(mystruct* item, int x) {//ищет в кольце все значения равные x и удаляет их
    mystruct* Nextitem = item;
    mystruct* Currentitem = item;
    

    Nextitem = item;
    //delete(Currentitem);
    int size = sizeof(item);

    if (Currentitem->x == x && Currentitem == item)
        //значит элемент по счету номер 1 надо удалить
        //для этого найдем второй элемент
        //и последний, в последнем сделаем ссылку на первый
        //а первый отвяжем у далим.
    {
        mystruct* DelItem = nullptr;
        mystruct* Last = item;
        Nextitem = Currentitem->Next;
        do {
            Last = Last->Next;
        } while (Last->Next != item);
        Last->Next = Nextitem;
        DelItem = Currentitem;
        delete DelItem; //вот такой костыль я придумал чтобы удалить из кучи мой объект.
        Currentitem = Nextitem;
        Currentitem = deleteitem(Currentitem, x);//пойдем дальше удалять рекурсивно вдруг
        // и элемент номер 2 искомый и его тоже надо удалить
    }

    else { // значит искомые элемент стоит не сначала кольца
        mystruct* Postitem = 0;
        do {
            mystruct* NextNextitem = item;

            Nextitem = Currentitem->Next;
            NextNextitem = Nextitem->Next;

            if (Nextitem->x == x) {
                Currentitem->Next = NextNextitem;
                delete Nextitem;

            }
            else { //delete Currentitem; 
            Currentitem = Currentitem->Next; }




        } while (Currentitem->Next != item);
        Currentitem = item;
    }
    return Currentitem;
};
int main()
{
    mystruct* item = new mystruct;
    mystruct* first = item;
    mystruct* Nextitem = item;
    bool iffirst = true;
    item->x = 0;
    int input = 0;
    //считываем в цикле числа, помещая их в кольцао, до тех пор пока не будет введено 0. тогда цикл завершаем.
    //проще алгоритма чтобы было всё четко я не додумал. :(
    do {

        std::cin >> input;
        if (iffirst && input != 0) { item->x = input; iffirst = false; }
        else {
            if (input != 0) {
                Nextitem = Nextitem->Next = new mystruct;
                Nextitem->x = input;
            }
            else Nextitem->Next = first;
        }
    } while (input != 0);



    std::cout << std::endl;

    item = deleteitem(item, 5);

    //insert(item, 2,555);

    Nextitem = item;
    //вывод кольца . цикл завершается только крестиком в окне, ведь это кольцо, 
    //а оно бесконечно, можно было бы и завершить по желанию , но не в этом суть :)
    do {
        std::cout << Nextitem->x << std::endl;
        Nextitem = Nextitem->Next;
        system("pause");
    } while (true);

    
    


}



Кратко опишу. у меня кольцо подобно однонаправленному списку с той лишь разницей с ним, что последний элемент указывает на первый(собственно определение кольца). элементы это целые числа отличные от нуля. список я описываю структурой mystract . в main кольцо забиваем значениями, а потом insert и delete мы можем вставить и удалить элемент соответственно. собственно вопрос в delete. один из параметров это целое число. алгоритм функции находит элементы кольца равные этому параметру и удаляет их. При этом я сначала "удалял" элементы отвязывая их от соседних. но вот озаботился , что сами объекты надо удалять физически delete-шкой.
1) на мой взгляд я коряво делаю вот таким образом :
Код: plaintext
1.
2.
       DelItem = Currentitem;
       delete DelItem; 


2) Как мне проверить , что я освобождаю ли я таким образом память ?
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921450
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron812) Как мне проверить , что я освобождаю ли я таким образом память ?

DrMemory, Valgrind.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921452
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81insert(mystruct* item, int index, int value)

Ну и чисто теоретически побурчать: кольца не применяются там, где у элемента есть индекс,
поэтому твоя реализация не столько кривая, сколько бессмысленная.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921491
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81insert(mystruct* item, int index, int value)

Ну и чисто теоретически побурчать: кольца не применяются там, где у элемента есть индекс,
поэтому твоя реализация не столько кривая, сколько бессмысленная.


нету в моей реализации индексов.
да, кольца изучаю только для повышения скилов.
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921503
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81нету в моей реализации индексов.

А "int index" это что тогда?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921505
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81нету в моей реализации индексов.

А "int index" это что тогда?

позиция где надо вставить элемент. я думал вы имели ввиду, что мои элементы где-то пронумерованы. нет не пронумерованы.
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921508
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Позиция" это и есть нумерация. В результате см.выше.

Если эту позиционность выкинуть, код сокращается, упрощается и ускоряется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921521
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

"Позиция" это и есть нумерация. В результате см.выше.

Если эту позиционность выкинуть, код сокращается, упрощается и ускоряется.


ну не понимаю вас. вот у массива к примеру есть позиция элементов - да, причем это физическая позиция - индекс.
а тут условие задачи такое которую я сам себе поставил - выставить после 2-го элемента какой-то новый элемент. но физически у кольца я никаких индексов не прописывал.
Вот где тут позиция ?
Код: plaintext
1.
2.
3.
4.
5.
struct mystruct {
    int x;
    mystruct* Next;

};


тут "x" - это данные. никакая не позиция , не путать
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921537
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
у меня кольцо подобно однонаправленному списку с той лишь разницей с ним, что последний элемент указывает на первый

А нельзя в векторе вместо .end() отдавать .begin() ?
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921542
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
andron81
у меня кольцо подобно однонаправленному списку с той лишь разницей с ним, что последний элемент указывает на первый

А нельзя в векторе вместо .end() отдавать .begin() ?


нельзя . важно использовать указатели.
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921546
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
нельзя . важно использовать указатели.

для какой задачи?
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921554
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
andron81
нельзя . важно использовать указатели.

для какой задачи?


ну тут мне важна реализация. до векоторов я может и дойду и реализация там будет проще, но писать я вряд ли на них буду . но мне надо указателями.
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921556
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

вышло довольно неплохо. и утечки можно если что посмотреть сделав паузу на предпоследней строке и почитав оутпут, но я их не выявил (искал подвисшие в памяти удаляемые элементы моего кольца). если кому интересно на поиск багов (хотя сомневаюсь , что будет кто заниматься этим :) ) или может полезно (студенту может какому), то пожалуйста.

Код: plaintext
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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
// ConsoleApplication6.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
#include <iostream>
#include <conio.h>

#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

const int KEY_ESC = 27;

struct mystruct {
    int x;
    mystruct* Next;

};

mystruct* insert(mystruct* item, int index, int  value) {
// по сути процедура абсурдна так как индекс для элемента кольца это что-то нелепое
// но грубо говоря будем считать , что индекс это порядковый номер их занесения в кольцо.

    if (item == nullptr) // если кольцо пустое , тогда индекс не имеет значения вставляем первым да и всё
    {
        
        item = new mystruct;
        item->x = value;
        item->Next = item;
        std::cout << "The ring was empty. Was added one element x="<<value << std::endl << std::endl;
        return item;
    } 
    
        
    
    if (index == 0) {//если хотим "в начало" кольца вставить новый элемент
        
        mystruct* Last = item;
        while (Last->Next != item)  Last = Last->Next;  //посчитаем последний элемент
        mystruct* Newitem = new mystruct;
        Last->Next = Newitem;
        Newitem->x = value;
        Newitem->Next = item;
        item = Newitem;
        std::cout << "Was added one element x="<<value <<" at first place " << std::endl << std::endl;
        return item;
    }
    
        int i = 1;
        mystruct* Current = item;
        while (!(Current->Next == item || i == index)) {
            Current = Current->Next;
            i++;
        }

        mystruct* Newitem = new mystruct;
        Newitem->x = value;
        Newitem->Next = Current->Next;
        Current->Next = Newitem;
        std::cout << "Was added one element x="<< value<< " after element #"<<index << std::endl << std::endl;
        return item;
    
    
    //std::cout << i<< std::endl;

}

mystruct* deleteitem(mystruct* Item,  int x) {//ищет в кольце все значения равные x и удаляет их

    mystruct* second;
    mystruct* Last=Item;
    mystruct* del;
    if (Item != nullptr ) // если кольцо не пустое , то будем работать
    {
        while (Last->Next != Item)  Last = Last->Next;  //посчитаем последний элемент

    //если первый же элемент кольца наш искомый
    while (Item->x == x)
    {
        //нужно найти второй элемент 
        //и последний
        //приравниваем к последнему next = указатель на второй элемент.
        //висящий первый элемент удаляем delete
        if (Item->Next == Item && Item->x == x) return nullptr;// Если кольцо из одного элемента и этот элемент надо удалить, то сразу nullptr
        second = Item->Next;
        Last->Next= second;
        delete Item;
        Item = second;
        

    }
    }
    if (Item != nullptr) //если наше кольцо не пустое , то посмотрим наличие элемента далее.
    {
        mystruct* Next = Item;
        do
        {
            if (Next->Next->x == x) {
                del = Next->Next;  
                Next->Next = Next->Next->Next; delete del;
            } else 
            Next = Next->Next;
        } while (Next->Next != Item);
    }

    std::cout << "Was deleted all elements equal " << x<< std::endl << std::endl;
    return Item;
};

mystruct* initring(mystruct* item) {//функция заполняет кольцо элементами

mystruct* first = item;
mystruct* Nextitem = item;
mystruct* last = item;

bool iffirst = true;
item->x = 0;
int input = 0;
int count = 0;
//считываем в цикле числа, помещая их в кольцао, до тех пор пока не будет введено 0. тогда цикл завершаем.

std::cout << "Enter ring. Enter 0 for finish " << std::endl << std::endl;
do {

    std::cout << "Enter element of ring ";  std::cin >> input;
    if (iffirst && input != 0) { item->x = input; iffirst = false; }
    else {
        if (input != 0) {
            Nextitem = Nextitem->Next = new mystruct;
            Nextitem->x = input;
            count++;
        }
        else { Nextitem->Next = first; last = Nextitem; }
    }
} while (input != 0);

if (count == 0) { item = nullptr; }
return item;
}
void printRing (mystruct*  item)
{
    mystruct*  Nextitem = item;
//вывод кольца . выводит по одному элементу . завершаем вывод клавишей Esc, а то так будет бесконечно выводить :)
    std::cout << "It's printing ring. Press Enter for next elements and Esc for finish "<< std::endl ;
char l;
if (item != nullptr) {
    do {
        std::cout << Nextitem->x << " " ;
        Nextitem = Nextitem->Next;

    } while (_getch() != KEY_ESC);
    std::cout << std::endl << std::endl;
}
else std::cout << "Ring is empty" <<std::endl << std::endl;
}

int main()
{
    mystruct* item = new mystruct;
    item = initring(item); //инициализация. ввод элементов кольца.

    std::cout << std::endl;
    printRing(item); //выводим кольцо
    item = insert(item, 0, 5);//вставляем в начало элемент равный 5
    printRing(item); //выводим кольцо
    item = insert(item, 1, 80);//вставляем после элемента №1 элемент равный 80
    printRing(item); //выводим кольцо
    item = insert(item, 0, 5);//вставляем в начало элемент равный 5
    printRing(item); //выводим кольцо
    item = insert(item, 2, 90);//вставляем после элемента №2 элемент равный 90
    printRing(item); //выводим кольцо
    item = insert(item, 4, 74);//вставляем после элемента №3 элемент равный 74
    printRing(item);//выводим кольцо

    item = deleteitem(item, 5);//ищем элементы равные 5 и удаяем их
    printRing(item);//выводим кольцо
 
#ifdef _DEBUG
    _CrtDumpMemoryLeaks();
#endif 
}
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921560
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
но мне надо указателями.

а гвоздь вам микроскопом забить не нужно?
полезный навык на случай, если вдруг окажетесь на острове после кораблекрушения микро-биологов.
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921561
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторitem = deleteitem(item, 5);//ищем элементы равные 5 и удаяем их
это в векторе есть изкаропки
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921565
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81ну тут мне важна реализация

Ну, у Вас получилась типичная поделка начинающего с функциями, имеющими время выполнения
O(N) вместо O(1). Она, конечно, работает, но в разы медленнее чем на её месте работала бы
структура, подходящая под задачу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921589
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81ну тут мне важна реализация

Ну, у Вас получилась типичная поделка начинающего с функциями, имеющими время выполнения
O(N) вместо O(1). Она, конечно, работает, но в разы медленнее чем на её месте работала бы
структура, подходящая под задачу.


я и есть начинающий. правда с функциями я знаком .
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921595
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81ну тут мне важна реализация

Ну, у Вас получилась типичная поделка начинающего с функциями, имеющими время выполнения
O(N) вместо O(1). Она, конечно, работает, но в разы медленнее чем на её месте работала бы
структура, подходящая под задачу.


Ну то есть структура должна была предполагать индекс, я верно Вас понимаю?
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921599
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Ну то есть структура должна была предполагать индекс, я верно Вас понимаю?
Нет конечно. Это бессмысленно. Индекс используется для нахождения элемента в списке, начиная с первого элемента. Но так как у тебя изначально кольцо - то и первого элемента в принципе быть не должно. И соответственно индексация тоже бессмысленна.
Вот тут и начинаются все проблемы - чтобы вообще не потерять все кольцо, надо помнить хотя бы один его элемент. Но ты назвал этот указатель first - поэтому все читающие твой код предполагают наличие первого элемента в кольце.
Во вторых, у функции insert есть параметр int index - зачем он?? Зачем вставляя в кольцо новое звено отсчитывать сколько-то там элементов от какого-то элемента??? Ты помнишь один из элементов кольца? Ну вот и вставляй новое звено после него.
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921604
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
andron81
Ну то есть структура должна была предполагать индекс, я верно Вас понимаю?
Нет конечно. Это бессмысленно. Индекс используется для нахождения элемента в списке, начиная с первого элемента. Но так как у тебя изначально кольцо - то и первого элемента в принципе быть не должно. И соответственно индексация тоже бессмысленна.
Вот тут и начинаются все проблемы - чтобы вообще не потерять все кольцо, надо помнить хотя бы один его элемент. Но ты назвал этот указатель first - поэтому все читающие твой код предполагают наличие первого элемента в кольце.
Во вторых, у функции insert есть параметр int index - зачем он?? Зачем вставляя в кольцо новое звено отсчитывать сколько-то там элементов от какого-то элемента??? Ты помнишь один из элементов кольца? Ну вот и вставляй новое звено после него.


Ну да задача поставлена мной же, допускаю, что абсурдность присутствует. Но задача есть задача. Да и вопрос главный ведь не по инсерту. Бог с ним с ним с инсертом. Вопросы по delete и по утечкам памяти.
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921605
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Зачем вставляя в кольцо новое звено отсчитывать сколько-то там элементов от какого-то элемента??? Ты помнишь один из элементов кольца? Ну вот и вставляй новое звено после него.


Ну вот бзик. Да верно подмечено, что кольцо это не понятно где начало, а где конец. Ну будем предполагать, что первый элемент это тот кто создался первым в кольце. От сюда и индексация, неявная.
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921621
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Ну будем предполагать, что первый элемент это тот кто создался первым в кольце. От сюда и индексация, неявная.

Оккам возражает))
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921623
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил
andron81
Ну будем предполагать, что первый элемент это тот кто создался первым в кольце. От сюда и индексация, неявная.

Оккам возражает))


???
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921626
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Изопропил
пропущено...

Оккам возражает))


???

https://ru.wikipedia.org/wiki/Бритва_Оккама
...
Рейтинг: 0 / 0
помогите разобраться с утечками памяти.
    #39921782
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Ну да задача поставлена мной же, допускаю, что абсурдность присутствует. Но задача есть задача. Да и вопрос главный ведь не по инсерту. Бог с ним с ним с инсертом. Вопросы по delete и по утечкам памяти.

это называется "снежный ком"
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / помогите разобраться с утечками памяти.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]