test_delete_pointer.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 130 行
CPP
130 行
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8// test_delete_pointer.cpp// (C) Copyright 2002 Vahan Margaryan. // Use, modification and distribution is subject to the Boost Software// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//#include <cstddef> // NULL#include <fstream>#include <cstdio> // remove#include <boost/config.hpp>#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{ using ::remove;}#endif#include "test_tools.hpp"#include <boost/detail/no_exceptions_support.hpp>#include <boost/serialization/throw_exception.hpp>#include <boost/serialization/nvp.hpp>#include <boost/serialization/split_member.hpp>#include <boost/serialization/vector.hpp>//A holds a pointer to another A, but doesn't own the pointer.//objCountclass A{ friend class boost::serialization::access; template<class Archive> void save(Archive &ar, const unsigned int /* file_version */) const { ar << BOOST_SERIALIZATION_NVP(next_); } template<class Archive> void load(Archive & ar, const unsigned int /* file_version */) { static int i = 0; ar >> BOOST_SERIALIZATION_NVP(next_); if(++i == 3) boost::serialization::throw_exception(boost::archive::archive_exception( boost::archive::archive_exception::no_exception )); } BOOST_SERIALIZATION_SPLIT_MEMBER()public: A() { next_ = 0; ++objcount; } A(const A& a) { next_ = a.next_; ++objcount; } ~A() { --objcount; } A* next_; static int objcount;};int A::objcount = 0;inttest_main( int /* argc */, char* /* argv */[] ){ std::vector<A*> vec; A* a = new A; a->next_ = 0; vec.push_back(a); //fill the vector with chained A's. The vector is assumed //to own the objects - we will destroy the objects through this vector. unsigned int i; for(i = 1; i < 10; ++i) { a = new A; vec[i - 1]->next_ = a; a->next_ = 0; vec.push_back(a); } const char * testfile = boost::archive::tmpnam(NULL); BOOST_REQUIRE(NULL != testfile); //output the vector { test_ostream os(testfile, TEST_STREAM_FLAGS); test_oarchive oa(os, TEST_ARCHIVE_FLAGS); oa << BOOST_SERIALIZATION_NVP(vec); } //erase the objects for(i = 0; i < vec.size(); ++i) delete vec[i]; vec.clear(); //read the vector back { test_istream is(testfile, TEST_STREAM_FLAGS); test_iarchive ia(is, TEST_ARCHIVE_FLAGS); BOOST_TRY { ia >> BOOST_SERIALIZATION_NVP(vec); } BOOST_CATCH (...){ ia.delete_created_pointers(); vec.clear(); } BOOST_CATCH_END } //delete the objects for(i = 0; i < vec.size(); ++i) delete vec[i]; vec.clear(); //identify the leaks BOOST_CHECK(A::objcount == 0); std::remove(testfile); return EXIT_SUCCESS;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?