构造析构函数发生异常 与 inline

本文探讨了C++中构造与析构函数在遇到异常时的处理机制,强调了构造期间异常的安全处理,并解析了inline函数的潜在问题。通过示例代码,展示了当构造函数中出现异常时,如何确保已构造的部分正确销毁,避免资源泄露。同时,提醒开发者在设计类构造逻辑时,慎用inline关键字,以防目标代码膨胀。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • inline
  • 构造析构函数发生异常

1.inline 函数就是 : 申请对此函数的每个调用都用 函数本体替换;

一个函数能否使用inline主要取决编译器;
总的来慎用inline,比如debug时又如果对一个不存在的函数设置断点,
比如会额外的增加目标代码,比如如果是一个库程序,则需要全部重新编译;
除非类似std::max,std::min 之类的函数

对于函数指针有例外情况
比如:
inline void func(){}
void (*pf)() = func;

//调用
func() ; //是一个inline调用

pf() ; //还是函数调用

2.构造析构函数异常与inline

*c++保证如果在构造期间有异常,则已经构造好的也会被销毁
结论:构造析构函数不要使用inline
比如:
class Base{
private:
    std::string s1,s2;
};
class Derived : public Base{
public:
    Derived(){} //空构造
private:
std::string s3,s4;    
};

以上Derived的构造函数在编译后大概是这样的:

Derived::Derived(){
    Base::Base();  //Base的构造函数也类似下面的代码,构造了s1,s2;
    
    try{
        s3(); //构造Derived::s3
    }
    catch(...){
        Base::~Base();
        throw;
    }
    try{
        s4(); //构造Derived::s4
    }
    catch(...){
        Base::~Base();
        throw;
    }
    
}

通过上述代码可以发现,如果Base构造是inline, Derived也是inline的话,
Base的构造函数代码将被插入Derived构造中,意味着Derived中执行4个string构造;
而在调用Derived的地方也将全部替换这些代码, 随着调用的次数越多目标代码将越庞大;

最终结论: 是否使用inline ,取决于此函数是否简单到像max/min;最后慎用inline :)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值