Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите найти утечку памяти, std, list 
:(
    Опции темы
ZC1989
Дата 15.4.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



Слушайте, замучался искать в чём ошибка, программа у меня работает, всё делает как должна, но в диспетчере видно что раз за разом увеличивается размер памяти.
Программа переодически обновляет данные через интернет. в результате получается 2 массива vector примерно по 1200 эллементов ms_Data. и при каждом обновлении вес программы растёт, на одинаковое колличество примерно, массив я очищаю, перед обновлением, в этот момент вес проги падает грубо с 4000 КБ до 3800 КБ и увеличивается до 4200Кб. и так каждый раз, +200, а должно всё очищаться((

Код

// структура данных (используются не все элементы, только те что нужны для каждого класса данных )
typedef struct _ms_Data{
    ms_Type    _type;
    bool    _create;

    int        activ;
    int        id;
    int        id_creator;
    int        id_editor;
    int        id_owner;
    int        id_img;
    int        id_menu;
    int        id_link;
    int        id_user;
    int        group;
    int        date_create;
    int        date_edit;
    int        date_begin;
    int        date_end;
    int        cost;
    int        available;
    int        internal_article;
    int        hidden;
    int        style;
    int        block;
    int        view_img;
    int        download;
    int        size;
    int        estimate;
    int        position;
    int        view_logo;
    int        number;
    int        activ_send;

    char    *title;
    char    *login;
    char    *pass;
    char    *text;
    char    *name_file_text;
    char    *name_file_img;
    char    *about;
    char    *name_table;
    char    *resolution;
    char    *phone;
    char    *fax;
    char    *fio;
    char    *icq;
    char    *email;
    char    *address;
    char    *company;
    char    *vacancy;
    char    *style_css;
    char    *alt;
    char    *ip;
    char    *articles;
    char    *url_proceed;
    char    *url;
    char    *cash;
} ms_Data;



// Фугкция разбивает запрос MySQL на элементы списка.
void MySQL_fetch_rowsarr(MYSQL *hMySQL, vector<list<char *>> *Arr)
{
    MYSQL_RES *res;
    MYSQL_ROW row;

    if(!(res = mysql_store_result(hMySQL))) 
        return;

    int t = 0;
    while((row = mysql_fetch_row(res))) 
    {
        list<char *> row_;
        for(int i = 0; i < (int)mysql_num_fields(res); i++){
            row_.push_back((char *)row[i]);
        }

        Arr->push_back(row_);
    }
}



// А эта заполняет arr таблицей с пользователями (к примеру)
bool    ms_get_users(MYSQL *hMySQL, list<ms_Data> *arr){
    char *query = new char[2048];

    strcpy(query, "SELECT * FROM `users`;");

    if(mysql_query(hMySQL, query))
        return false;

    vector<list<char *>> GetList;
    vector<list<char *>>::iterator iGetList;
    list<char *>::iterator iGetData;

    MySQL_fetch_rowsarr(hMySQL, &GetList);

    for(iGetList = GetList.begin(); iGetList != GetList.end(); ++iGetList)
    {
        iGetData = (*iGetList).begin();

        ms_Data DataTemp;
        DataTemp._type = mst_Users;

        DataTemp.id            = atoi((char*)*iGetData++);
        DataTemp.login        = (char*)*iGetData++;
        DataTemp.pass        = (char*)*iGetData++;
        DataTemp.group        = atoi((char*)*iGetData++);
        DataTemp.fio        = (char*)*iGetData++;
        DataTemp.email        = (char*)*iGetData++;
        DataTemp.icq        = (char*)*iGetData++;
        DataTemp.about        = (char*)*iGetData++;
        DataTemp.activ        = atoi((char*)*iGetData++);
        DataTemp.date_create= atoi((char*)*iGetData);

        arr->push_back(DataTemp);
    }

    return true;
}



перед вызовом ms_get_users(MYSQL *hMySQL, list<ms_Data> *arr) я очищаю список.
но думаю что память растёт только лишь потому что в списке хранятся только указатели на строковые значения и собственно сами строки остаются висеть в памяти...но тогда непонятно как их очистить? пробовал много всяких выриантов с delete, каждый раз вылетала прога((


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
azesmcar
Дата 15.4.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



ZC1989

Первое что заметил, где вызов mysql_free_result?

дальше пока не смотрел, добавь а там видно будет, ибо
Цитата

You must also call mysql_free_result() after you are done with the result set. 

 smile

Добавлено @ 16:30
Цитата(ZC1989 @  15.4.2010,  16:25 Найти цитируемый пост)
typedef struct _ms_Data{
    ms_Type    _type;
    bool    _create;
    int        activ;
    int        id;
    int        id_creator;
    int        id_editor;
...
} ms_Data;

зачем нужен этот ужас?? std::map для чего писали?

Это сообщение отредактировал(а) azesmcar - 15.4.2010, 16:31
PM   Вверх
ZC1989
Дата 15.4.2010, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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

mysql_free_result где ты говоришь добавить? добавляю прямо в функции. после всего, и программа ничего не отображает, а щас MYSQL_RES *res; должен же очистить после окончания функции


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
azesmcar
Дата 15.4.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ZC1989 @  15.4.2010,  16:37 Найти цитируемый пост)
mysql_free_result где ты говоришь добавить? 

после mysql_store_result, как закончил работать с данными.

Цитата(ZC1989 @  15.4.2010,  16:37 Найти цитируемый пост)
после всего, и программа ничего не отображает

??? ничего не понял.
PM   Вверх
ZC1989
Дата 15.4.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



я добавил mysql_free_result в самом конце void MySQL_fetch_rowsarr(MYSQL *hMySQL, vector<list<char *>> *Arr) и в итоге таблица с пользователями пуста (точнее я авторизироваться в программе теперь не могу даже) потому что пользователь такой отсутствует


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ИванМ
Дата 15.4.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



ZC1989, как я понимаю, нужно не копировать указатели, а пользоваться strcpy. Или еще лучше использовать std::string.
Какой, кстати, библиотекой пользуетесь? Я тоже такую хочу.
PM MAIL   Вверх
azesmcar
Дата 15.4.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Я ничего ровным счетом о твоей программе не знаю, а вижу часть кода, которая делает непонятно что, выдели неработающий кусок кода в отдельный проект, покажи код и скажи что именно не работает. Очистка результатов запросе ПОСЛЕ их использования на программу никак влиять не должны.

Добавлено @ 16:50
Цитата(ИванМ @  15.4.2010,  16:49 Найти цитируемый пост)
Какой, кстати, библиотекой пользуетесь? Я тоже такую хочу. 

 smile 
скачай отсюда
C:\Program Files\MySQL\include
C:\Program Files\MySQL\lib

Добавлено @ 16:51
Цитата(ИванМ @  15.4.2010,  16:49 Найти цитируемый пост)
как я понимаю, нужно не копировать указатели, а пользоваться strcpy. Или еще лучше использовать std::string.

и да кстати .. это скорее всего и есть причина smile 

Это сообщение отредактировал(а) azesmcar - 15.4.2010, 16:52
PM   Вверх
ИванМ
Дата 15.4.2010, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Цитата(azesmcar @  15.4.2010,  16:49 Найти цитируемый пост)
скачай отсюда

Нету такого. Через denwer юзаю. Но суть понятна, спасибо, все оказывается просто. smile 
PM MAIL   Вверх
azesmcar
Дата 15.4.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  15.4.2010,  16:52 Найти цитируемый пост)
Нету такого

Report broken link smile 
PM   Вверх
ИванМ
Дата 15.4.2010, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



ZC1989, не можете мне скинуть на e-mail папочки include и lib. Я вам плюсик поставлю smile 
Подлизываюсь)
PM MAIL   Вверх
azesmcar
Дата 15.4.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



PM   Вверх
ИванМ
Дата 15.4.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



azesmcar, благодарю вас.
PM MAIL   Вверх
azesmcar
Дата 15.4.2010, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



ZC1989

Кстати, лучше скачай драйвер для C++, облегчишь себе задачу..там нормально в классах все написано.

Добавлено через 3 минуты и 48 секунд
ИванМ

вообще-то собирался вот эту прислать..видимо случайно не туда кликнул, тут побольше выбора
http://www.mysql.com/products/connector/
PM   Вверх
ZC1989
Дата 15.4.2010, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



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

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

Код


#ifndef        __ftp_session__
#define        __ftp_session__

#include <windows.h>
#include <wininet.h>
#include <mysql.h>
#include <list>
#include <vector>
#include ".\\md5.h"
#include ".\\mysql_types.h"
#include ".\\mysql_functions.h"
#include ".\\string.h"

using namespace std;

#pragma comment(lib, "wininet")
#pragma comment(lib, "libmysql")


class CMS_Connect{
public:
    HINTERNET hInternet;
    HINTERNET hFTP;
    MYSQL hMySQL;
    bool
        connect_internet,
        connect_ftp,
        connect_mysql
        ;

private:
    char query[2048];
    MYSQL_RES *res;
    MYSQL_ROW row;


public:


        /*
            Конструктор класса.
            */
    ::CMS_Connect(){
        connect_internet = false;
        connect_ftp = false;
        connect_mysql = false;
    }


        /*
            Подключение к интернету.
            */
    void Connect_Internet(){
        hInternet = InternetOpen("fatex_cms_admin", INTERNET_OPEN_TYPE_DIRECT, NULL, 0, 0);

        if(hInternet == 0) connect_internet = false;
        connect_internet = true;
    }


        /*
            Подключение к FTP.
            */
    void Connect_FTP(char *host, char *login, char *pass){
        hFTP = InternetConnect(hInternet, host, INTERNET_DEFAULT_FTP_PORT, login, pass, INTERNET_SERVICE_FTP, 0, (DWORD)0);

        if(hFTP == 0) connect_ftp = false;
        connect_ftp = true;
    }


        /*
            Подключение к MySQL.
            */
    void Connect_MySQL(char *host, char *login, char *pass, char *batebase){
            // Инициализация MySQL
        if(!mysql_init(&hMySQL)){ connect_mysql = false; return; }
            // Подключение к серверу.
        if(!(mysql_real_connect(&hMySQL, host, login, pass, batebase, 0 , NULL , 0))){ connect_mysql = false; return; }

        mysql_query(&hMySQL, "SET NAMES cp1251;");

        

        connect_mysql = true;
    }


        /*
            Состояние подключения.
            */
    bool Status_Connect(){
        if(connect_internet && connect_ftp && connect_mysql) return true;
        return false;
    }


        /*
            Разрыв подключения.
            */
    void Disconnect(){
            // Подключение к MySQL.
        mysql_close(&hMySQL);
            // Подключение к FTP.
        ::InternetCloseHandle(hFTP);
            // Подкючение к интернету.
        ::InternetCloseHandle(hInternet);

            // Очистка состояний подключения.
        connect_internet = false;
        connect_ftp = false;
        connect_mysql = false;
    }


        /*
            Проверка авторизации пользователя.
            */
    bool Authorization(char *login, char *password, ms_Data *ACTIV_USER)
    {
        md5::md5_context md5str;
        unsigned char digest[16];
        uint8 *b = new uint8[32];
        uint8 *a = new uint8[16];

// запрашиваю.

        strcpy(query, "SELECT * FROM `users` WHERE `login` ='");
        strcat(query, login);
        strcat(query, "';");

        if(mysql_query(&hMySQL, query))
            return false;

// список с пользователями.
        vector<list<char *>> Arr;

// тут из общей каши текстовых полей
// получается чтото более менее вразумительное (список пользователей = )
        MySQL_fetch_rowsarr(&hMySQL, &Arr);

        vector<list<char *>>::iterator t; 

// ищу в списке человека с нужным именем и пассвордом
        list<char *>::iterator at; 
        for(t=Arr.begin(); t!=Arr.end();++t)
        {
            at=(*t).begin();

            ++at;
            if(!strcmp(login, (char *)*at)){
                ++at;


// проверяю пасс на кодировку...
                md5::md5_starts(&md5str);
                md5::md5_update(&md5str, (uint8 *)password, (int)strlen(password));
                md5::md5_finish(&md5str, digest);

                for(int i=0; i < 32; i++)
                    b[i] = (  (  ((char *)*at)[i]  <='9')  &&  (  ((char *)*at)[i]  >=  0  )  )? b[i]=  ((char *)*at)[i]  -'0' : b[i] = 10 +  ((char *)*at)[i]  - 'a';

                for(int i =0; i < 16; i++)
                    a[i] = (  b[2*i]  <<  4  ) + b[2*i+1];

                bool err = false;
                for(int i = 0; i < 16 && !err; i++)
                    if(a[i] != digest[i])err = true;


// и вот тут я если логин и пасс совпали, забиваю ту большую структуру данными о пользователе.

                if(err)
                    return false;
                else{
                    at=(*t).begin();
                    ACTIV_USER->id = atoi(*at++);
                    ACTIV_USER->login = (char*)*at++;
                    ACTIV_USER->pass = (char*)*at++;
                    ACTIV_USER->group = atoi(*at++);
                    ACTIV_USER->fio = (char*)*at++;
                    ACTIV_USER->email = (char*)*at++;
                    ACTIV_USER->icq = (char*)*at++;
                    ACTIV_USER->about = (char*)*at++;
                    ACTIV_USER->activ = atoi(*at++);
                    ACTIV_USER->date_create = atoi(*at);

                    return true;
                }
            }
        }

        return false;
    }


};

#endif




если просто приводить более менее основной код, слишком муторно будет...

а на счёт того что я передаю ссылки в массив и после делаю clear(); - удаляются ли содежимые этих ссылок? или так и продолжают висеть в памяти?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ИванМ
Дата 15.4.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



azesmcar,  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0871 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.