2014-11-10 2 views
0

Я пытаюсь использовать shared_ptr для защиты утечек памяти, которые библиотека sqlite3 бросает в мое приложение.Использование shared_ptr с sqlite3

Мне нужно перевести мой простой код на C++ в защищенную версию без огромных изменений. Текущее состояние моего кода что-то вроде:

sqlite3* db = NULL; 
sqlite3_open(dbname.c_str(), &db); 
sqlite3_close(db); 

И я попробовал:

std::shared_ptr<sqlite3> db(NULL); 
sqlite3_close(db.get()); 

Но я не могу перевести открытую функцию, поскольку она запрашивает sqlite3 ** параметр, который я не способный эмулировать общий указатель. Я нашел std :: shared_ptr соединение (rawConnec, sqlite3_close); , но этот вид функции не имеет официальной документации или любого примера.

Я так заблокирован, Вы так много

+0

«Этот вид функции» является конструктором и [документирован] (http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr). –

+0

Извините @CL. , Я не имел в виду, что это не было документировано. Я не мог найти его. Спасибо за ссылку. Во всяком случае, я не понимаю, какое определение я должен использовать, если я не могу использовать определение shared_ptr как переменную, потому что я должен передать его как двойную ссылку в функции «open». –

ответ

1
std::shared_ptr<sqlite3> db(nullptr); 
{ 
    sqlite3* dbPtr = NULL; 
    sqlite3_open(dbname.c_str(), &dbPtr); 
    db.reset(dpPtr, sqlite3_close); 
} 

Тогда однажды db и все остальные std::shared_ptr s выходят из области видимости sqlite3_close будет называться на вашем ресурсе.

Однако это немного рушится, и в конечном итоге вам будет намного лучше со стандартным классом RAII, чем стандартная практика на C++.

+0

Спасибо @sjdowling, я проверил вашу работу и отлично работает. Однако я не смог удалить все утечки памяти в моем приложении, но я думаю, что это может зависеть от архитектуры или других частей кода. Большое спасибо –

Смежные вопросы