The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Неправильное выделение памяти"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Неправильное выделение памяти"  
Сообщение от cyclon (ok) on 03-Май-06, 12:23 
Вообщем тут наткнулся на непонятное мне явление, я не отрицаю что мог
где то ошибится, но никак не могу понять где, вот код:

#include <iostream>
#include <cstdlib>
#include <mysql/mysql.h>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

using namespace std;

MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;

struct r{
    char **rez;
} *get;

int num;

//Connection to server and to database
bool conn(char *hostname, char *username, char *passwd, char *dbname, int port)
{
    mysql_init(&mysql);
    if(!(mysql_real_connect(&mysql,hostname,username,passwd,dbname,port,0,0))){

        fprintf(stderr, "%s\n", mysql_error(&mysql));
        return false;
    }
    if(mysql_select_db(&mysql,dbname)){
        fprintf(stderr, "%s\n", mysql_error(&mysql));
        return false;
    }
    return true;
}

//Query to database
bool query(char **rez, char *str)
{
    int i, l = 0;
    if(mysql_query(&mysql,str)){
        fprintf(stderr, "%s\n", mysql_error(&mysql));
        return false;
    }
    if(!(res = mysql_store_result(&mysql))){
        if(rez) fprintf(stderr, "%s\n", mysql_error(&mysql));
        return false;
    }
    while((row = mysql_fetch_row(res))){
        for (i=0 ; i < mysql_num_fields (res); i++){
            rez[l] = new char[strlen(row[i])];
            rez[l] = strcpy(rez[l],row[i]);
            l++;
        }
    }
    if(!mysql_eof(res)){
        fprintf(stderr, "%s\n", mysql_error(&mysql));
        return false;
    }
    mysql_free_result(res);
    return true;
}

void out()
{
    int fd = open("/home/cyclon/out.html", O_WRONLY | O_CREAT);
    chmod("/home/cyclon/out.html", S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP);

    for(int n = 0; n < num; n++){
        cout << get[0].rez[n] << "\n";
        write(fd,get[0].rez[n],strlen(get[0].rez[n]));
        write(fd,"<br>",strlen("<br>"));
    }
    close(fd);
}

int main(int argc, char *argv[])
{
    get = new r[100];

    conn("localhost","root","t3521098","gendw",3306);

    get[0].rez = new char*[1];
    query(get[0].rez,"select count(*) from content;");
    num = atoi(get[0].rez[0]);
    delete get[0].rez[0], get[0].rez;

    get[0].rez = new char*[num];
    query(get[0].rez,"select word from content;");

    out();

    for(int i = 0; i < num; i++){
//         delete get[0].rez[i];
    }
    delete get[0].rez;

    cout << "Done!" << endl;
    return EXIT_SUCCESS;
}

Ошибка в следующем, в выходном файле, начиная с 1000-го элемента
в конце каждой строки добивает один лишний символ (мусор), а к последнему
элементу два символа. Причём это не зависит от их количества, главное
что бы их было больше 1000, может быть и 5000 и 10000, всегда одно и тоже,
один лишний символ после тысячной строки и два на последней.

Как мне кажется я где то накосячил с выделением памяти, но не могу
понять где именно.

Строка:
//         delete get[0].rez[i];
закоменчена поскольку на ней происходит падение проги с сообщением
об ошибке во free , потому убрал что бы каждый раз не валилась, хотя
это первое что натолкнуло меня на ошибку. Собсно она и есть следствие
не правильного выделения памяти.

Заранее спасибо!!!

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Неправильное выделение памяти"  
Сообщение от SSuslov (ok) on 03-Май-06, 14:41 
Есть хорошая прога для отлавливания утечек памяти. Называется она valgrind. Вооружайся. Попробуй прогнать через нее, она покажет место, где происходят траблы.
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Неправильное выделение памяти"  
Сообщение от cyclon (ok) on 03-Май-06, 14:51 
>Есть хорошая прога для отлавливания утечек памяти. Называется она valgrind. Вооружайся. Попробуй
>прогнать через нее, она покажет место, где происходят траблы.


пробовал, вот только ссылается на

            rez[l] = new char[strlen(row[i])];
            rez[l] = strcpy(rez[l],row[i]);

    int fd = open("/home/cyclon/out.html", O_WRONLY | O_CREAT);

        cout << get[0].rez[n] << "\n";

    query(get[0].rez,"select word from content;");

        write(fd,get[0].rez[n],strlen(get[0].rez[n]));

    get[0].rez = new char*[num];

    get[0].rez = new char*[1];

    get = new r[1];

    mysql_init(&mysql);


но вроде ощибок нет :((

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Неправильное выделение памяти"  
Сообщение от cyclon (ok) on 03-Май-06, 15:04 
Занятно, добавил

write(fd,rez[l],strlen(rez[l]));
write(fd,"<br>",strlen("<br>"));

внутрь цикла заполненя rez из row и там всё нормально, а не из него хренотень.
Но такой подход не устраивает :((( Ибо нужно записывать отдельно от query
функции.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Неправильное выделение памяти"  
Сообщение от SSuslov (ok) on 03-Май-06, 15:53 
К сожалению, не могу проверить на компе, нет линукса временно. Ты не пробовал проходить дебаггером? Если ругается на выделение, то, скорее всего, либо выход за пределы, либо что-то с размером при выделении. Можешь скинуть output valgrind'а?
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Неправильное выделение памяти"  
Сообщение от Niam on 03-Май-06, 15:57 
попробуйте                        
rez[l] = new char[strlen(row[i])+1];
strcpy(rez[l],row[i]);

не забывайте про завершающий символ! ему тоже нужна память =). И обычно не надо присваивать результат операции strcpy(rez[l],row[i]).

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

9. "Неправильное выделение памяти"  
Сообщение от cyclon (ok) on 03-Май-06, 16:09 
>попробуйте
>rez[l] = new char[strlen(row[i])+1];
>strcpy(rez[l],row[i]);
>
>не забывайте про завершающий символ! ему тоже нужна память =). И обычно
>не надо присваивать результат операции strcpy(rez[l],row[i]).


Огромное спасибо, чё то я видать стормозил, хотя казалось что пробовал добавлять на один элемент больше для терминатора :)))

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

6. "Неправильное выделение памяти"  
Сообщение от cyclon (ok) on 03-Май-06, 16:05 
>К сожалению, не могу проверить на компе, нет линукса временно. Ты не
>пробовал проходить дебаггером? Если ругается на выделение, то, скорее всего, либо
>выход за пределы, либо что-то с размером при выделении. Можешь скинуть
>output valgrind'а?


чё то не догоню, пускаю из консоли valgrind и мою прогу то он грит что всё хорошо, а если через кдевелоп то валгринд кажет кучу ошибок.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

7. "Неправильное выделение памяти"  
Сообщение от SSuslov (ok) on 03-Май-06, 16:06 
>>К сожалению, не могу проверить на компе, нет линукса временно. Ты не
>>пробовал проходить дебаггером? Если ругается на выделение, то, скорее всего, либо
>>выход за пределы, либо что-то с размером при выделении. Можешь скинуть
>>output valgrind'а?
>
>
>чё то не догоню, пускаю из консоли valgrind и мою прогу то
>он грит что всё хорошо, а если через кдевелоп то валгринд
>кажет кучу ошибок.

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

8. "Неправильное выделение памяти"  
Сообщение от SSuslov (ok) on 03-Май-06, 16:08 
Если разобраться не получиться, то скинь мне базу, можешь дамп базы и исходники. Я могу дома вечером отладить.
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

10. "Неправильное выделение памяти"  
Сообщение от SSuslov (ok) on 03-Май-06, 16:09 
>Если разобраться не получиться, то скинь мне базу, можешь дамп базы и
>исходники. Я могу дома вечером отладить.

email: Sergey.Suslov@tlmcom.ru

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

11. "Неправильное выделение памяти"  
Сообщение от cyclon (ok) on 03-Май-06, 16:31 
>>Если разобраться не получиться, то скинь мне базу, можешь дамп базы и
>>исходники. Я могу дома вечером отладить.
>
>email: Sergey.Suslov@tlmcom.ru


Всё, уже разобрался, действительно не хватало одного символа для терминатора.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру