1
0
forked from boostorg/core

Added a check for NULL pointer in fclose_deleter.

The deleter can be called on a null pointer by shared_ptr.

Also added tests with unique_ptr from Boost.Move and shared_ptr
from Boost.SmartPtr.
This commit is contained in:
Andrey Semashev
2022-09-21 18:09:42 +03:00
parent 3510f6244b
commit 00f4f11f14
3 changed files with 30 additions and 8 deletions

View File

@@ -16,17 +16,29 @@
#include <cstdio>
#include <cstddef>
#include <boost/config.hpp>
#include <boost/move/unique_ptr.hpp>
#include <boost/smart_ptr/shared_ptr.hpp>
#if !defined(BOOST_NO_CXX11_SMART_PTR)
#include <memory>
#endif
boost::movelib::unique_ptr< std::FILE, boost::fclose_deleter > make_boost_unique_file(const char* filename)
{
return boost::movelib::unique_ptr< std::FILE, boost::fclose_deleter >(std::fopen(filename, "w"));
}
boost::shared_ptr< std::FILE > make_boost_shared_file(const char* filename)
{
return boost::shared_ptr< std::FILE >(std::fopen(filename, "w"), boost::fclose_deleter());
}
#if !defined(BOOST_NO_CXX11_SMART_PTR)
std::unique_ptr< std::FILE, boost::fclose_deleter > make_unique_file(const char* filename)
std::unique_ptr< std::FILE, boost::fclose_deleter > make_std_unique_file(const char* filename)
{
return std::unique_ptr< std::FILE, boost::fclose_deleter >(std::fopen(filename, "w"));
}
std::shared_ptr< std::FILE > make_shared_file(const char* filename)
std::shared_ptr< std::FILE > make_std_shared_file(const char* filename)
{
return std::shared_ptr< std::FILE >(std::fopen(filename, "w"), boost::fclose_deleter());
}
@@ -43,9 +55,18 @@ int main()
file = NULL;
}
make_boost_unique_file(filename);
make_boost_shared_file(filename);
#if !defined(BOOST_NO_CXX11_SMART_PTR)
make_unique_file(filename);
make_shared_file(filename);
make_std_unique_file(filename);
make_std_shared_file(filename);
#endif
// Test if the deleter can be called on a NULL pointer
boost::shared_ptr< std::FILE >(static_cast< std::FILE* >(NULL), boost::fclose_deleter());
#if !defined(BOOST_NO_CXX11_SMART_PTR)
std::shared_ptr< std::FILE >(static_cast< std::FILE* >(NULL), boost::fclose_deleter());
#endif
std::remove(filename);