当前位置:  开发笔记 > 编程语言 > 正文

帮助我使这段代码异常安全

如何解决《帮助我使这段代码异常安全》经验,为你挑选了1个好方法。

所以我有这个库代码,请看......

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 &objs) : objs_(objs) {}

    ~Thing() {
        for(vector::iterator i = objs_.begin(); i != objs_.end(); ++i) {
            delete *i;
        }
    }

private:
    vector objs_;
}

在我的客户端代码中......

   class FooObj : public Thing::Obj
    {
        virtual void operator()() {
            //do stuff
        }
    }

    class BarObj : public Thing::Obj
    {
        virtual void operator()() {
            //do different stuff
        }
    }

vector 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的想法,我还没有想到.

    平底船.实际上,如果构造函数抛出,应用程序即将崩溃,但我想更优雅地处理它.

jalf.. 5

看一眼 boost::ptr_vector



1> jalf..:

看一眼 boost::ptr_vector

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有