C++: Optimizing out destructor call

前端 未结 2 1555
刺人心
刺人心 2021-01-29 13:31

There is a little code example here:

struct Data {
};

struct Init {
    Data *m_data;

    Init() : m_data(new Data) { }
    ~Init() {
        delete m_data;
           


        
2条回答
  •  孤城傲影
    2021-01-29 13:50

    void callInitA() {
        Init x;
        somefunction(x); // calls the "const Init &" constructor
    }
    

    The destruction of x cannot be optimized away, regardless of the contents of Init. Doing so would violate the design of the language.

    It's not just a matter of whether Init contains resources or not. Init x, like all objects, will allocate space on the stack that later needs to be cleaned up, as an implicit (not part of code that you yourself write) part of the destructor. It's impossible to avoid.

    If the intention is for x to be an object that somefunction can call without having to repeatedly create and delete references to x, you should be handling it like this:

    void callInitA(Init & x) { //Or Init const& x
        somefunction(x); // calls the "const Init &" constructor
    }
    

    A few other notes:

    • Make sure you implement the Rule of Five (sometimes known as Rule of Three) on any object that owns resources.
    • You might consider wrapping all pointers inside std::unique_ptr, as it doesn't seem like you need functionality beyond what std::unique_ptr offers.

提交回复
热议问题