        #include <iostream>
       #include <memory>
     
     
        void SomeFunc()
        {
            auto r1_cleanup = [](int* ptr){
                std::cout << "r1_cleanup is called" << std::endl;
            };
     
            auto r2_cleanup = [](int* ptr){
                std::cout << "r2_cleanup is called" << std::endl;
            };
            
            auto r3_cleanup = [](int* ptr){
                std::cout << "r3_cleanup is called" << std::endl;
            };
     
        auto lv = std::unique_ptr<int, decltype(r1_cleanup)>(new int()/*::init1(...)*/, r1_cleanup);
        auto cv1 = std::unique_ptr<int, decltype(r2_cleanup)>(new int()/*::init2(...)*/, r2_cleanup);
        auto cv2 = std::unique_ptr<int, decltype(r3_cleanup)>(new int()/*::init3(...)*/, r3_cleanup);
     
    /*...*/
        }
     
        int main() {
            SomeFunc();
            return 0;
        }