LINUX.ORG.RU

Неправильное выделение памяти


0

0

Вообщем тут наткнулся на непонятное мне явление, я не отрицаю что мог
где то ошибится, но никак не могу понять где, вот код:

#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[1];

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

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

Ответ на: комментарий от cyclon

Занятно, добавил

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

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

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

> всё, проблемма рещена, просто забыл добавить +1 в выделении память для rez
valgrind спасет отца русской демократии.

syomin
()
Ответ на: комментарий от syomin

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

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.