首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++编程尝试捕获

C++编程尝试捕获
EN

Stack Overflow用户
提问于 2012-03-28 23:26:30
回答 6查看 670关注 0票数 0

我正在为一个对象分配内存,如果内存分配后的特定语句失败,我必须删除内存并抛出异常。

例如,假设

代码语言:javascript
复制
               QSqlQuery *query =  new QSqlQuery(db);
               try {
                query->prepare(somestmt);
               }
               catch (...) {
                throwException(*query);
               }

在这里,如果抛出异常,我应该在哪里以及如何删除查询?

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-03-28 23:38:40

答案取决于您需要query对象存活多长时间。如果在try/except块之外不需要它,那么最好在离开该块后立即使用RAII将其删除。例如,使用boost::scoped_ptr,你可以这样做:

代码语言:javascript
复制
try {
    boost::scoped_ptr<QSqlQuery> query(new QSqlQuery(db));
    query->prepare(somestmt);
}
catch (...) {
    throwException();
}

但是从您的示例中看,您似乎希望将query对象或其副本保留在该块之后的位置。如果可以只保留一个副本,那么您可以这样做:

代码语言:javascript
复制
boost::scoped_ptr<QSqlQuery> query(new QSqlQuery(db));
try {
    query->prepare(somestmt);
}
catch (...) {        
    QSqlQuery copyOfQuery(*query);
    throwException(copyOfQuery);
}

或者这个,如果你不喜欢使用boost:

代码语言:javascript
复制
QSqlQuery* query = new QSqlQuery(db);
try {
    query->prepare(somestmt);
}
catch (...) {        
    QSqlQuery copyOfQuery(*query);
    delete query;
    throwException(copyOfQuery);
}
delete query;

如果您需要保留原始查询本身,则可能需要要求异常对象本身将其删除。也就是说,这样做:

代码语言:javascript
复制
QSqlQuery* query = new QSqlQuery(db);
try {
    query->prepare(somestmt);
}
catch (...) {        
    throw MyException(query);
}
delete query;

其中“MyException”的合同的一部分是它取得其参数的所有权(即,删除它的责任)。

另一种选择是使用共享指针。即:

代码语言:javascript
复制
boost::shared_ptr<QSqlQuery> query(new QSqlQuery(db));
try {
    query->prepare(somestmt);
}
catch (...) {        
    throwException(query);
}

这样做的好处是,当指向查询的最后一个共享指针消失时,查询将被删除,这使得内存管理变得容易得多。

票数 2
EN

Stack Overflow用户

发布于 2012-03-28 23:28:06

您应该使用来优雅地处理此问题。

使用智能指针而不是原始指针,或者使用资源管理类包装已分配的指针,以便在作用域结束时释放已分配的对象。

票数 0
EN

Stack Overflow用户

发布于 2012-03-28 23:28:37

这取决于您的程序,如果您可以重试准备,并且需要指针有效,请不要删除它,否则请删除内存,理想情况下将poitner设置为null来标记它

编辑:对不起,误解了问题-更改了答案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9910772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档