答えは、クエリオブジェクトが存続するために必要な時間によって異なります。あなたがtry/exceptブロックの外にそれを必要としないならば、ブロックを離れるとすぐにRAIIを使って削除するのが最善でしょう。
try {
boost::scoped_ptr<QSqlQuery> query(new QSqlQuery(db));
query->prepare(somestmt);
}
catch (...) {
throwException();
}
をしかし、あなたの周りにそのブロックを過ぎて、クエリオブジェクト、またはそれのコピーを保存しておきたいようなあなたの例から、それが見えます:例えば、ブースト:: scoped_ptrをを使用して、あなたはこれを行うことができます。あなたは、元のを維持する必要がある場合は
QSqlQuery* query = new QSqlQuery(db);
try {
query->prepare(somestmt);
}
catch (...) {
QSqlQuery copyOfQuery(*query);
delete query;
throwException(copyOfQuery);
}
delete query;
:あなたはブーストを使用して好きではない場合は、これを
boost::scoped_ptr<QSqlQuery> query(new QSqlQuery(db));
try {
query->prepare(somestmt);
}
catch (...) {
QSqlQuery copyOfQuery(*query);
throwException(copyOfQuery);
}
または:それはちょうどそれのコピーを保持しても大丈夫だ場合は、これを行うことができますそれ自身を照会すると、それを削除するためには例外オブジェクト自体を必要とするでしょう。すなわち、このような何か:
QSqlQuery* query = new QSqlQuery(db);
try {
query->prepare(somestmt);
}
catch (...) {
throw MyException(query);
}
delete query;
「MyException」の契約の一部が、それはその引数の所有権を取ることである
(すなわち、それを削除するための責任)。
共有ポインターを使用することもできます。これは、最後の共有ポインタがなくなるとクエリが削除されるという利点があり、メモリ管理がはるかに容易になります。
woof! ;)あなたは本当にすべて60秒で入力しましたか? +1良い答え – slashmais
'boost :: scoped_ptr'と' boost :: shared_ptr'の代わりに 'std :: unique_ptr'と' std :: shared_ptr'を使うことができます。 – bames53
驚くばかり!ありがとう、エドワード! – user1065969