Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
0 / 2 / 0
Регистрация: 14.08.2017
Сообщений: 139
1

Очистка памяти от массива

31.08.2017, 22:04. Показов 7195. Ответов 4
Метки нет (Все метки)

Всем привет! Придумал себе небольшую задачку, чисто в учебных целях. Написал код небольшой. Цель: чтение таблицы из текстового документа, в поисках одинаковых 12-символьных значений. Это поиск 2-х одинаковых MAC-адресов, в таблице DHCP сервера.

В самом начале main() код читает весь объем текста, что бы понять какая длинна (сколько раз по 12 символов) содержится там. В общем сколько MAC-адресов в таблице, что бы далее знать сколько итераций поиска нужно будет совершить.

Вопрос в том, почему я не могу потом удалить этот массив, ведь он уже не нужен? Если включить закомментированный delete, не компелируется. Почему так? Я новичок совсем в программировании, знаю что код выглядит страшно, не кидайте камнями

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
// Finding same mac-adreses in a text file.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cstring>
using namespace std;
 
void Getmac(char *buf, int possition)
{
    char text[13] = "\0";
    ifstream in("table.txt", ios::in | ios::binary);
    register int i;
    for (i = 0; i < possition; i++)
    {
        in.get(text, 13);
 
    }
    in.close();
    strcpy_s(buf, sizeof(text), text);
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    ifstream in("table.txt", ios::in | ios::binary);
    char str[360000];
    
    in.read((char*)str, sizeof(str));
    int N = in.gcount() / 12;
    in.close();
    //delete[] str; // удаление всего массива  - если включить это, происходит ошибка.
    
    int samecount(0), linepointer(0);
    char str0[13], str1[13], str3[1200] = " ";
    for (int i(1); i <= N; i++)
    {
        Getmac(str0, i);
        for (int j(i + 1); j <= N; j++)
        {
            Getmac(str1, j);
 
            if (!strcmp(str0, str1))
            {
                //cout << str0 << " и " << str1 << " совпадают." << endl;  
                samecount++;
                linepointer++;
                strcat_s(str3, sizeof(str3), str0);
                str3[12 * samecount] = ' ';
                if (linepointer == 3)
                {
                    str3[12 * samecount] = '\n';
                    linepointer = 0;
                }
            }
            //else if (strcmp(str0, str1)) cout << str0 << " и " << str1 << " не совпадают." << endl;   
        } 
    }
    cout << "\n";
    cout << "\t\tВсего в базе: " << N << " mac адресов. " << endl;
    cout << "\n";
    cout << "\tНайдено " << samecount << " mac-адреса, повторяющихся более 1 раза: " << endl;
    cout << "\n";
    cout << "\t" << str3 << endl;
    _getch();
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2017, 22:04
Ответы с готовыми решениями:

Очистка памяти массива (С++)
Не получается очистить память массива. По моему коду, по завершении программы выдаётся ошибка...

Очистка памяти
При выполнении программы, память приложения растёт, а она должна быть неизменной. int main() {...

очистка памяти
при запуск программы сама собой создаётся точка останова в строке 59. И дальше программа идти не...

Очистка памяти
Вот сделал лабу и все работает отлично, но осталось последнее new выделяет память мне нужно...

4
Рэмбо комнатный
102 / 102 / 99
Регистрация: 05.03.2017
Сообщений: 510
31.08.2017, 22:07 2
GregoryE, потому что память ты не выделял под него

Добавлено через 1 минуту
есть бы ты делал так, то можно было бы удалять
C++
1
2
char* kek=new char[10];
delet[] kek;
0
0 / 2 / 0
Регистрация: 14.08.2017
Сообщений: 139
31.08.2017, 22:12  [ТС] 3
Я так пробовал, тогда запись "= in.gcount() / 12;" возвращает 0 почему то.
А нужно ли вообще удалять? Этот массив висит в памяти?
0
nd2
3422 / 2802 / 1252
Регистрация: 29.01.2016
Сообщений: 9,426
31.08.2017, 23:20 4
Цитата Сообщение от GregoryE Посмотреть сообщение
Я так пробовал, тогда запись "= in.gcount() / 12;" возвращает 0 почему то.
Потому, что здесь уже нет массива (есть выделенный блок памяти), поэтому sizeof(str) возвратит размер указателя, а не размер блока.
C++
1
2
3
4
5
6
    char* str  = new char[360000];
    
    in.read(str, 360000);
    int N = in.gcount() / 12;
    //...
    delete [] str;
Добавлено через 2 минуты
Цитата Сообщение от GregoryE Посмотреть сообщение
Если включить закомментированный delete, не компелируется. Почему так?
Через delete удаляется то, что выделяется через new.

Добавлено через 1 минуту
Цитата Сообщение от GregoryE Посмотреть сообщение
А нужно ли вообще удалять? Этот массив висит в памяти?
Этот?
Цитата Сообщение от GregoryE Посмотреть сообщение
char str[360000];
При выходе из main удалится. Если через new, то пока работает программа, потом ОС подчистит (если delete не было).
0
0 / 2 / 0
Регистрация: 14.08.2017
Сообщений: 139
31.08.2017, 23:46  [ТС] 5
Спасибо!

Добавлено через 17 минут
Кстати, непонятную тенденцию отмечаю: при количестве мак адресов не более 500 шт, поиск одинаковых занимает меньше минуты, как только количество мак-адресов в таблице переваливает за 1000, поиск идет бесконечно долго, ни разу не дожидался.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2017, 23:46

Очистка памяти
Подскажите пожалуйста что не так делаю, создаю массив лейблов: TLabel **Labels; Labels = new...

Очистка памяти
Цель: Написать программу, которая читает текст из файла и записывает в новый файл те слова,...

очистка памяти
в данном случае деструктор очистит всё, или нет? #include &quot;base.h&quot; #include &lt;cstdlib&gt; #include...

Очистка памяти
Как правильно очистить память в массиве классов Вот код конструктора, выделяющего память, и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru