std::unique_ptr
with Custom Deleters
std::unique_ptr
is designed to manage single ownership of dynamically allocated objects. By default, std::unique_ptr
uses the delete
function to deallocate memory. However, you can customize the deletion behavior by providing a lambda function, a function pointer, or a function object as the deleter.
Here is an example of using a custom deleter with std::unique_ptr
:
#include <iostream>
#include <memory>
struct FileDeleter {
void operator()(FILE* file) {
std::cout << "Closing file..." << std::endl;
fclose(file);
}
};
int main() {
std::unique_ptr<FILE, FileDeleter> filePtr(fopen("myfile.txt", "w"));
if (filePtr) {
// File successfully opened
// Do something with the file
}
// The file will be automatically closed when filePtr goes out of scope
return 0;
}
In the code above, we define a custom deleter FileDeleter
that closes the file using fclose()
. We then use this custom deleter when declaring the std::unique_ptr
object filePtr
. When filePtr
goes out of scope, the custom deleter function is automatically called, ensuring proper cleanup.
std::shared_ptr
with Custom Deleters
std::shared_ptr
allows multiple smart pointers to share ownership of an object. It relies on a reference count to determine when to deallocate memory. By default, std::shared_ptr
uses delete
to free the memory allocated by new
. However, you can also provide a custom deleter by passing a function or functor as the second template argument.
Here is an example of using a custom deleter with std::shared_ptr
:
#include <iostream>
#include <memory>
struct CustomDeleter {
void operator()(int* ptr) {
std::cout << "Custom deleter called..." << std::endl;
delete ptr;
}
};
int main() {
std::shared_ptr<int> sharedPtr(new int(42), CustomDeleter());
if (sharedPtr) {
// Do something with the shared pointer
}
// The memory will be deallocated when the last shared_ptr goes out of scope
return 0;
}
In the above code, we define a custom deleter CustomDeleter
that uses delete
to deallocate the memory. We pass it as the second argument to the std::shared_ptr
constructor. When the last std::shared_ptr
owning the resource is destroyed, the custom deleter will be called.
Conclusion
std::unique_ptr
and std::shared_ptr
are powerful smart pointers that help manage dynamically allocated objects. By using custom deleters, you can specify specialized cleanup logic for these smart pointers. Whether it’s closing a file or freeing memory using a custom allocation scheme, custom deleters provide flexibility in managing resources with smart pointers.
#customdeleters #smartpointers