帮助我使这段代码异常安全
所以我有这个库代码,请看......
class Thing
{
public:
class Obj
{
public:
static const int len = 16;
explicit Obj(char *str)
{
strncpy(str_, str, len);
}
virtual void operator()() = 0;
private:
char str_[len];
};
explicit Thing(vector<Obj*> &objs) : objs_(objs) {}
~Thing() {
for(vector<Obj*>::iterator i = objs_.begin(); i != objs_.end(); ++i) {
delete *i;
}
}
private:
vector<Obj*> objs_;
}
在我的客户端代码中......
class FooObj : public Thing::Obj
{
virtual void operator()() {
//do stuff
}
}
class BarObj : public Thing::Obj
{
virtual void operator()() {
//do different stuff
}
}
vector<Objs*> objs;
int nStructs = system_call(*structs);
for(int i = 0; i < nStructs; i++) {
objs.push_back(newFooObj(structs[i].str));
}
objs.push_back(newBarObj("bar1");
objs.push_back(newBarObj("bar2");
Thing thing(objs);
// thing does stuff, including call Obj::()() on the elements of the objs_ vector
我坚持的是异常安全。就目前而言,如果任何Obj构造函数抛出,或者Thing构造函数抛出,则向量中的Objs将泄漏。向量需要包含指向Objs的指针,因为它们被多态地使用。而且,我需要在这里处理任何异常,因为这是从一个不知道异常的旧代码库调用的。
我认为,我的选择是:
将客户端代码包装在一个巨大的try块中,并清理catch块中的向量。
在所有分配周围放置try块,其catch块调用常见的清理函数。
一些聪明的基于RAII的想法,我还没有想到。
平底船。实际上,如果构造函数抛出,应用程序即将崩溃,但我想更优雅地处理它。
没有找到相关结果
已邀请:
7 个回复
祁澈盘哼颗
添加
会员:
然后您的客户端中的分配代码变为:
正如另一张海报建议的那样,矢量中的智能指针类型也可以正常工作。只是不要使用STL的
;它不遵循正常的复制语义,因此不适合在STL容器中使用。 Boost提供的
和即将推出的C ++ 0x会很好。
砷竣阿
挂帘妈乡
犁攀富
磐乓铝举
哩翔购
虽然如果没有抛出异常,你仍然想要清理objs。
迪擅哨乘傅