Ответ зависит от того, как долго вам нужен объект запроса, чтобы остаться в живых.Если вам не нужно это вне блока try / Кроме того, вероятно, лучше использовать RAII, чтобы удалить его, как только вы выходите из этого блока.Например, используя boost :: 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);
}
Или вот, если вам не нравится использовать boost:
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» заключается в том, что он вступает во владение своим аргументом (т.е. несет ответственность за его удаление).
Другой вариантбудет использовать общие указатели.Т.е.:
boost::shared_ptr<QSqlQuery> query(new QSqlQuery(db));
try {
query->prepare(somestmt);
}
catch (...) {
throwException(query);
}
Преимущество этого в том, что запрос удаляется при исчезновении последнего общего указателя на него, что значительно упрощает управление памятью.