私はこのコードを持っています、
class DbUpdater
{
private:
MYSQL mysql;
MYSQL *connection;
int connect()
{
mysql_init(&mysql);
this->connection = mysql_real_connect(&mysql, "localhost", "root", "password", "dbname", 0, 0, CLIENT_MULTI_STATEMENTS);
if (this->connection == NULL)
{
printf(mysql_error(&mysql));
return 0;
}
mysql_set_character_set(connection, "utf8");
return 1;
}
vector <TrackingHistory*> getTrackingHistoryByNumber(string number)
{
MYSQL_RES *result;
MYSQL_ROW row;
string query = "SELECT * FROM tracking_history WHERE number = '" + number + "' ORDER BY date DESC;";
int state = mysql_query(this->connection, query.c_str());
result = mysql_store_result(this->connection);
vector <TrackingHistory*> trackingHistory;
int numRows = mysql_num_rows(result);
while ((row = mysql_fetch_row(result)) != NULL) {
TrackingHistory *item = new TrackingHistory(atoi(row[0]), atoi(row[1]), string(row[2]), string(row[3]),
string(row[4]), string(row[5]), string(row[6]), string(row[7]), string(row[8]), string(row[9]));
trackingHistory.push_back(item);
}
mysql_free_result(result);
return trackingHistory;
}
public:
DbUpdater()
{
this->connect();
}
void UpdateDB(vector <HistoryItem*> historyItems)
{
vector <TrackingHistory*> trackingHistory = this->getTrackingHistoryByNumber( historyItems[0]->Number);
}
};
だから、私はクラスのインスタンスを作成し、DbUpdater
単にメソッドを呼び出しますUpdateDb()
私は機能的に奇妙な振る舞いをしていますgetTrackingHistoryByNumber()
int numRows = mysql_num_rows(result);
、この行はsegfaultをスローします。1 つの接続で多くのクエリを実行した場合にのみ発生します。繰り返しのたびに再接続すると、すべてのクエリに問題はありません。
たとえば、10 個のクエリがあります。プログラムを初めて起動すると、2 番目のクエリで segfault がスローされます。次の起動では、3 番目のクエリで segfault がスローされます。そして、次の開始は4番目のクエリでそれをスローします。
libmysql
ubuntu 12.04のリポジトリから使用します
この理由は何ですか?
ありがとう、そして私の英語でごめんなさい。