1

ポインターだけでなく、unique_ptr を使用するようにコードを変換しています。カスタムデリータで関数 sqlite3_finalize(sqlite3_stmt *pStmt) を自動的に呼び出す sqlite3_statement への unique_ptr を作成しようとしています。これをヘッダーファイルで機能させるにはどうすればよいですか? 私はここで完全に途方に暮れています。どんな助けも大歓迎です。ありがとう。

igleyy の多くの助けを借りて (彼の解決策では、何らかの理由で削除プログラムが呼び出されたときにメモリ アクセス エラーが発生しました)、機能しているようでエレガントに見えるこの解決策を思いつきました。

データソース.h


#pragma once
#include <sqlite\sqlite3.h>
#include <string>
#include <vector>
#include <memory>

class Datasource
{

    void statementDeleter(sqlite3_stmt* object);
    std::unique_ptr<sqlite3_stmt, std::function<void(sqlite3_stmt*)>> statement;

    Datasource(Datasource const &);
    Datasource &operator=(Datasource const &);

public:
Datasource(void);
~Datasource(void);
};

データソース.cpp


#include "Datasource.h"

Datasource::Datasource(void) : 
statement(nullptr,std::bind(&Datasource::statementDeleter,this,std::placeholders::_1))
{
}

void Datasource::statementDeleter(sqlite3_stmt * s)
{
sqlite3_finalize(s);
}

Datasource::~Datasource(void)
{
}
4

3 に答える 3

1

ステートメントを解放するカスタム デリータを定義するだけです。

struct sqlite_finalizer {
    void operator()(sqlite3_stmt*& s) const {
        sqlite3_finalize(s);
        // ... anything else.
    }
};

次に、カスタム typedef を作成します。

using sqlite3_handle = std::unique_ptr<sqlite3_stmt, sqlite_finalizer>;
sqlite3_handle handle;
于 2013-11-11T17:44:23.907 に答える