Beste mensen,
Al enige tijd trad er na X uur (uur of 10 maar wel altijd na even veel tijd) een segmentatie fout op in een zelf gemaakt programma. Best irritant. Valgrind werd ik niet veel wijzer van dus ik ben maar begonnen door secties uit de code aan en uit te zetten en het programma steeds weer uit te proberen. Inmiddels ben ik er achter dat dit stukje code in ieder geval een oorzaak is. Zonder deze code actief geen segmentatie fout.
Per toeval stuitte ik op het gegeven dat ik geen mysql_free_result(confres) gebruikte. Dit lijkt mij op dit moment de oorzaak maar ik heb het nog niet getest. Maar hoe komt dit eigenlijk? Ik ging er vanuit dan confres out of scope ging en dus vanzelf de allocatie verloor? Of verliest alleen de pointer zijn allocatie, maar de gealloceerde data pas na de free result?
Verder gebruik ik nog lret = *mysql_fetch_row(confres); waar lret dus een char*. Echter MYSQL_ROW, de output vanmysql_fetch_row(confres) is volgens mij een char**. Kan dit ook problemen opleveren? De database levert overigens maar 1 waarde van 1 cijfer lang.
Ik geloof overigens dat ik het beste sowieso chars kan vermijden maar waar mogelijk std::strings te gebruiken, of is dat niet zo?
Onderstaande code komt uit een msql_connectie class waarin conn de MYSQL connectie is.
Al enige tijd trad er na X uur (uur of 10 maar wel altijd na even veel tijd) een segmentatie fout op in een zelf gemaakt programma. Best irritant. Valgrind werd ik niet veel wijzer van dus ik ben maar begonnen door secties uit de code aan en uit te zetten en het programma steeds weer uit te proberen. Inmiddels ben ik er achter dat dit stukje code in ieder geval een oorzaak is. Zonder deze code actief geen segmentatie fout.
Per toeval stuitte ik op het gegeven dat ik geen mysql_free_result(confres) gebruikte. Dit lijkt mij op dit moment de oorzaak maar ik heb het nog niet getest. Maar hoe komt dit eigenlijk? Ik ging er vanuit dan confres out of scope ging en dus vanzelf de allocatie verloor? Of verliest alleen de pointer zijn allocatie, maar de gealloceerde data pas na de free result?
Verder gebruik ik nog lret = *mysql_fetch_row(confres); waar lret dus een char*. Echter MYSQL_ROW, de output vanmysql_fetch_row(confres) is volgens mij een char**. Kan dit ook problemen opleveren? De database levert overigens maar 1 waarde van 1 cijfer lang.
Ik geloof overigens dat ik het beste sowieso chars kan vermijden maar waar mogelijk std::strings te gebruiken, of is dat niet zo?
Onderstaande code komt uit een msql_connectie class waarin conn de MYSQL connectie is.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| double msql_conn::GetSetting(int settingID) {
char * lret;
double code;
std::stringstream ss; //create a stringstream
std::string querytext;
ss << settingID; //add number to the stream
querytext = std::string("SELECT settings_actief FROM settings
WHERE settings_id= ") + std::string(ss.str());
if (mysql_query(conn, querytext.c_str())) {
return (-1.0);
} else {
MYSQL_RES *confres = mysql_store_result(conn);
int totalrows = mysql_num_rows(confres);
int numfields = mysql_num_fields(confres);
if (totalrows != 0 && numfields != 0) {
lret = *mysql_fetch_row(confres);//<-- moet met MYSQL_ROW? (Oorzaak?)
code = atof(lret);
mysql_free_result(confres);//<-- dit had ik nog niet, oorzaak?
return (code);
} else {
mysql_free_result(confres);//<-- dit had ik nog niet, oorzaak?
return (-1.0);
}
}
} |