Ответ зависит от того, как долго вам нужен объект запроса, чтобы он оставался в живых. Если вам не нужно это вне блока try/except, то, вероятно, лучше всего использовать RAII, чтобы удалить его, как только вы покинете этот блок. Например, с помощью наддува :: scoped_ptr, вы можете сделать это:
try {
boost::scoped_ptr<QSqlQuery> query(new QSqlQuery(db));
query->prepare(somestmt);
}
catch (...) {
throwException();
}
Но из вашего примера, это выглядит, как вы хотите сохранить объект запроса, или его копию, вокруг мимо этого блока. Если это нормально, чтобы просто сохранить копию, то вы можете сделать это:
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 (...) {
QSqlQuery copyOfQuery(*query);
delete query;
throwException(copyOfQuery);
}
delete query;
Если вам необходимо сохранить оригинал сам запрос, тогда вам, вероятно, понадобится сам объект исключения, чтобы удалить его. Т.е., сделать что-то вроде этого:
QSqlQuery* query = new QSqlQuery(db);
try {
query->prepare(somestmt);
}
catch (...) {
throw MyException(query);
}
delete query;
Где часть договора «MyException» 's является то, что он становится владельцем своего аргумента (то есть, ответственность за удаление).
Другим вариантом является использование общих указателей. Т.е .:
boost::shared_ptr<QSqlQuery> query(new QSqlQuery(db));
try {
query->prepare(somestmt);
}
catch (...) {
throwException(query);
}
Это имеет то преимущество, что запрос будет удален, когда последний общий указатель на него уходит, что делает управление памятью гораздо проще.
woof! ;) Вы действительно набрали все это за 60 секунд? +1 хороший ответ – slashmais
Вы можете использовать 'std :: unique_ptr' и' std :: shared_ptr' вместо 'boost :: scoped_ptr' и' boost :: shared_ptr'. – bames53
Удивительный! Спасибо, Эдвард! – user1065969