#include <iostream>
template < typename T>
class RAIIpointer
{
private :
T* _raw_pointer;
public :
explicit RAIIpointer( T* managed) : _raw_pointer( managed)
{
std:: cout << "\t \t Allocating memory for single object\n " ;
}
~RAIIpointer( )
{
std:: cout << "\t \t Releasing memory for single object\n " ;
delete _raw_pointer;
}
} ;
template < typename T>
class RAIIpointer< T[ ] > // array specialization
{
private :
T* _raw_pointer;
public :
explicit RAIIpointer( T* managed) : _raw_pointer( managed)
{
std:: cout << "\t \t Allocating memory for array\n " ;
}
~RAIIpointer( )
{
std:: cout << "\t \t Releasing memory for array\n " ;
delete [ ] _raw_pointer;
}
} ;
int main( )
{
std:: cout << "Before entering RAII scope\n " ;
{
std:: cout << "\t Creating a smart pointer...\n " ;
RAIIpointer< int > smart_ptr( new int ) ; // that's it, automatic release when scope ends
RAIIpointer< int [ ] > smart_ptr_arr( new int [ 42 ] ) ; // same
std:: cout << "\t Done with it\n " ;
}
std:: cout << "After exiting RAII scope\n " ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgUkFJSXBvaW50ZXIKewpwcml2YXRlOgogICAgVCogX3Jhd19wb2ludGVyOwpwdWJsaWM6CiAgICBleHBsaWNpdCBSQUlJcG9pbnRlcihUKiBtYW5hZ2VkKTogX3Jhd19wb2ludGVyKG1hbmFnZWQpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0QWxsb2NhdGluZyBtZW1vcnkgZm9yIHNpbmdsZSBvYmplY3RcbiI7CiAgICB9CiAgICB+UkFJSXBvaW50ZXIoKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFJlbGVhc2luZyBtZW1vcnkgZm9yIHNpbmdsZSBvYmplY3RcbiI7CiAgICAgICAgZGVsZXRlIF9yYXdfcG9pbnRlcjsKICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIFJBSUlwb2ludGVyPFRbXT4gLy8gYXJyYXkgc3BlY2lhbGl6YXRpb24Kewpwcml2YXRlOgogICAgVCogX3Jhd19wb2ludGVyOwpwdWJsaWM6CiAgICBleHBsaWNpdCBSQUlJcG9pbnRlcihUKiBtYW5hZ2VkKTogX3Jhd19wb2ludGVyKG1hbmFnZWQpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0QWxsb2NhdGluZyBtZW1vcnkgZm9yIGFycmF5XG4iOwogICAgfQogICAgflJBSUlwb2ludGVyKCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRSZWxlYXNpbmcgbWVtb3J5IGZvciBhcnJheVxuIjsKICAgICAgICBkZWxldGVbXSBfcmF3X3BvaW50ZXI7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6Y291dCA8PCAiQmVmb3JlIGVudGVyaW5nIFJBSUkgc2NvcGVcbiI7CiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJcdENyZWF0aW5nIGEgc21hcnQgcG9pbnRlci4uLlxuIjsKICAgICAgICBSQUlJcG9pbnRlcjxpbnQ+IHNtYXJ0X3B0cihuZXcgaW50KTsgLy8gdGhhdCdzIGl0LCBhdXRvbWF0aWMgcmVsZWFzZSB3aGVuIHNjb3BlIGVuZHMKICAgICAgICBSQUlJcG9pbnRlcjxpbnRbXT4gc21hcnRfcHRyX2FycihuZXcgaW50WzQyXSk7IC8vIHNhbWUKICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0RG9uZSB3aXRoIGl0XG4iOwogICAgfQogICAgc3RkOjpjb3V0IDw8ICJBZnRlciBleGl0aW5nIFJBSUkgc2NvcGVcbiI7Cn0=