gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:12:19 26 4
gpt4 key购买 nike

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

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 构造函数抛出异常,那么 vector 中已经存在的 Objs 就会泄漏。 vector 需要包含指向 Objs 的指针,因为它们以多态方式使用。而且,我需要在这里处理任何异常,因为这是从一个无法识别异常的旧代码库调用的。

在我看来,我的选择是:

  1. 将客户端代码包装在一个巨大的 try block 中,并清理 catch block 中的 vector 。
  2. 在所有分配周围放置 try block ,其中的 catch block 调用公共(public)清理函数。
  3. 一些我还没有想到的基于 RAII 的聪明想法。
  4. 平底船。实际上,如果构造函数抛出异常,应用程序无论如何都会在火焰中折叠,但我想更优雅地处理这个问题。

最佳答案

关于c++ - 帮助我使这段代码异常安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/596964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com