Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2013, 19:29   #1
User90
Новичок
Джуниор
 
Регистрация: 28.01.2013
Сообщений: 3
По умолчанию Проблема с утечкой оперативной памяти

При использовании данной программы для создание паролей при больших количестве вариантов переборов около 2*10 в 13 степени происходит непрерывный прирост оперативной памяти , что в конечном итоге приводит к аварийному завершению программы:
Код:
#include <iostream>
#include <algorithm>
#include <time.h>
#include <stdlib.h>
#include <fstream>

using std::cout;
using std::cin;
using std::endl;


class PassGen 
{

public:
    void displayMessage()
    {
        unsigned long long passLenght;
        unsigned long long numOfPasswords;
        char * filename = new char;

        cout << "Введите длину пароля для генерации: ";
        cin >> passLenght;
        cout << "Введите количество паролей для генерации: ";
        cin >> numOfPasswords;
        cout << "Будет сгенерировано паролей: " << numOfPasswords << "." << endl;
        cout << endl;
        cout << "Введите имя файла для записи: ";
        cin >> filename;

        std:: ofstream outFile(filename);

        for (unsigned long long k = 0; k < numOfPasswords; k++) 
		{
            for (unsigned long long i = 0; i < passLenght; ++i) 
			{    
                numOfchars(passLenght);
                passGenerator(passLenght);
                outFile << password [i];
            }
            outFile << endl;
			
        }
        outFile.close();

        cout << "Пароли успешно сгенерированы и записаны в файл " << filename << "" << endl;
		cin.get ();
		cin.get ();
    }

    void passGenerator(unsigned long long passLenght)
    {
        char* password = new char [passLenght];

        for (unsigned long long i = 0; i < numOfNumbers; ++i) 
		{
            password [i] = char(rand() % 10 + 48);
        }
        for (unsigned long long i = numOfNumbers; i < numOfNumbers + numOfBigchars; ++i) 
		{
            password [i] = char(rand() % 26 + 65);
        }
        for (unsigned long long i = numOfNumbers + numOfBigchars; i < passLenght; ++i) 
		{
            password [i] = char(rand() % 26 + 97);
        }
         std::random_shuffle(password, password + passLenght);
		 
    }

    void numOfchars(unsigned long long passLenght)
    {
        numOfSmallchars = rand() % passLenght;
        unsigned long long charRandEnd = passLenght - numOfSmallchars;
        numOfBigchars = rand() % charRandEnd;
        numOfNumbers = passLenght - numOfSmallchars - numOfBigchars;
		
    }

private:
    unsigned long long numOfSmallchars;
    unsigned long long numOfBigchars;
    unsigned long long numOfNumbers;
    

};

int main()
{
    setlocale(LC_ALL, "Russian");
    time_t srand(time(NULL));
    PassGen * pass = new PassGen;
    pass->displayMessage();
    delete [] pass;
    return 0;
}
Подскажите как лучше оптимизировать код и где и как необходимо еще очистить динамическую память , что б это не повлияло на ее работу?

Последний раз редактировалось User90; 28.01.2013 в 23:05.
User90 вне форума Ответить с цитированием
Старый 28.01.2013, 19:43   #2
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию

Непонятно, что с именем файла: резервируется только 1 символ? А где освобождается использованная память?
Dmitry_B вне форума Ответить с цитированием
Старый 28.01.2013, 23:03   #3
User90
Новичок
Джуниор
 
Регистрация: 28.01.2013
Сообщений: 3
По умолчанию

вообще это не мой исходный код, я его немного изменил, delete [] pass но этого не достаточно....но потери памяти в есть...

Последний раз редактировалось User90; 28.01.2013 в 23:15.
User90 вне форума Ответить с цитированием
Старый 28.01.2013, 23:11   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

User90

вообще это не мой исходный код

тогда надо вырвать руки тому, кто этот код написал.
с таким подходом C++ противопоказан.

не говоря о том что класс - одна большая фикция. Ничего полезного не далет, а то что делает - криво и через (_|_) неправильно.
Rififi вне форума Ответить с цитированием
Старый 28.01.2013, 23:17   #5
User90
Новичок
Джуниор
 
Регистрация: 28.01.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
User90

вообще это не мой исходный код

тогда надо вырвать руки тому, кто этот код написал.
с таким подходом C++ противопоказан.

не говоря о том что класс - одна большая фикция. Ничего полезного не далет, а то что делает - криво и через (_|_) неправильно.
как убрать потери в памяти ?
User90 вне форума Ответить с цитированием
Старый 28.01.2013, 23:31   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

User90

переписать код так, чтобы там не было ни одного new/delete в явном виде.
К примеру, зачем ты создаешь инстанс PassGen динамически?
бездуменое применение возможностей C++ - верный путь к провалу (:
Rififi вне форума Ответить с цитированием
Старый 29.01.2013, 19:46   #7
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 83
По умолчанию

Ещё раз: где возвращается вот эта память:
char * filename = new char; ?
Надо в деструкторе освободить.
Dmitry_B вне форума Ответить с цитированием
Старый 29.01.2013, 20:06   #8
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Гораздо интересней, где овобождается вот эта память:
Код:
char* password = new char [passLenght];
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 29.01.2013, 20:09   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Да не парьтесь Вы с этим (если у Вас не 386-я машина)
Утечку Вашей программы, устранит супервизор Винды, после закрытия приложения (или деструктор по-умолчанию).
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 29.01.2013, 21:08   #10
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Угу, а потом смотришь на прогу - интрефейс г, не х не делает, а как "поработает" несколько минут... так и 8 Гб оперативы съест и еще свопит.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CreateThread непонятки с утечкой памяти fucil Общие вопросы Delphi 3 15.01.2013 20:50
Проблема с утечкой памяти mr_cipher C# (си шарп) 10 28.08.2012 14:18
Проблема с установкой оперативной памяти! Банжо Компьютерное железо 3 20.02.2011 13:15
Проблема с утечкой памяти ExPeL Win Api 4 21.10.2010 22:13
самописный assert: проблема с утечкой памяти) sashonk Общие вопросы C/C++ 2 26.04.2010 15:58