我正在为一个对象分配内存,如果内存分配后的特定语句失败,我必须删除内存并抛出异常。
例如,假设
QSqlQuery *query = new QSqlQuery(db);
try {
query->prepare(somestmt);
}
catch (...) {
throwException(*query);
}在这里,如果抛出异常,我应该在哪里以及如何删除查询?
谢谢!
发布于 2012-03-28 23:38:40
答案取决于您需要query对象存活多长时间。如果在try/except块之外不需要它,那么最好在离开该块后立即使用RAII将其删除。例如,使用boost::scoped_ptr,你可以这样做:
try {
boost::scoped_ptr<QSqlQuery> query(new QSqlQuery(db));
query->prepare(somestmt);
}
catch (...) {
throwException();
}但是从您的示例中看,您似乎希望将query对象或其副本保留在该块之后的位置。如果可以只保留一个副本,那么您可以这样做:
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);
}这样做的好处是,当指向查询的最后一个共享指针消失时,查询将被删除,这使得内存管理变得容易得多。
发布于 2012-03-28 23:28:06
您应该使用来优雅地处理此问题。
使用智能指针而不是原始指针,或者使用资源管理类包装已分配的指针,以便在作用域结束时释放已分配的对象。
发布于 2012-03-28 23:28:37
这取决于您的程序,如果您可以重试准备,并且需要指针有效,请不要删除它,否则请删除内存,理想情况下将poitner设置为null来标记它
编辑:对不起,误解了问题-更改了答案
https://stackoverflow.com/questions/9910772
复制相似问题