Кому принадлежит память, возвращаемая MySQL Connector C ++? - PullRequest
0 голосов
/ 07 марта 2011

У меня возникают ошибки утечки памяти / удаления при использовании MySQL Connector C ++ 1.05.

Connector возвращает указатель на набор результатов при выполнении запроса.

Я назначаю указатель на boost::shared_ptr.Вызов выглядит так:

std::string query_text;
query_text = /* ... */;
boost::shared_ptr<sql::Statement> query(p_db_connection->createStatement());
if (!query)
{
    return;
}
boost::shared_ptr<sql::ResultSet>  query_results(query->executeQuery(query_text));
if (!query_results->next())
{
    return;
}

Вот мои вопросы:

  1. Кто отвечает за удаление выделенного результирующего набора?
  2. Должен ли я использовать scoped_ptr или shared_ptr если результаты используются только внутри функции?
  3. Является ли результат действительным при выполнении другого запроса?

Я использую MySQL Connector C ++ 1.05, MSVisual Studio 2008 версия 9.0.

1 Ответ

1 голос
/ 07 марта 2011

1) Согласно этому примеру, вы все делаете правильно.

Если вы используете shared_ptr<X> для сохранения результата, он будет автоматически удален после того, как ваш shared_ptr объект выйдет из области видимости (в вашем случае) / не будет иметь больше реальных ссылок (говоря глобально).

2) Это зависит, но наиболее распространенная практика - использовать scoped_ptr, потому что его конструирование и освобождение памяти происходит намного быстрее, и, используя его в явном виде, подтверждает, что объект действителен только для текущей области видимости 1011 *.

3) Я не уверен, что правильно понял вопрос, но вы можете выполнить действие .reset для вашего Results и заполнить его новым результатом запроса.

Кроме того, я уверен, что ваши утечки происходят из памяти, выделенной где-то еще (может быть и в библиотеке) . Возможно, вы не удаляете что-то, связанное с соединителем, см. Документацию.

...