URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5383
[ Назад ]

Исходное сообщение
"Неправильное выделение памяти"

Отправлено cyclon , 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 , потому убрал что бы каждый раз не валилась, хотя
это первое что натолкнуло меня на ошибку. Собсно она и есть следствие
не правильного выделения памяти.

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


Содержание

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

"Неправильное выделение памяти"
Отправлено cyclon , 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);


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


"Неправильное выделение памяти"
Отправлено cyclon , 03-Май-06 15:04 
Занятно, добавил

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

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


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

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

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


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


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


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


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


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

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


"Неправильное выделение памяти"
Отправлено SSuslov , 03-Май-06 16:08 
Если разобраться не получиться, то скинь мне базу, можешь дамп базы и исходники. Я могу дома вечером отладить.

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

email: Sergey.Suslov@tlmcom.ru


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


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