Files
serialization/test/test_delete_pointer.cpp
Robert Ramey 967934453c 1. Moved pfto, state_saver, strong_typedef, smart_cast, static_warning into serialization Library.vcproj
2. created copy of original throw exception for use in the serialization Library.vcproj
3. addressed error maintenance of static type table which shows up on GCC
4. fixed internal names in xml_grammar so as not to conflict with likely preprocessor macros.
5. streamlined xml_grammar so as not to depend upon on non-thread safe component.


[SVN r48575]
2008-09-04 16:44:57 +00:00

130 lines
3.0 KiB
C++

/////////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.
//objCount
class 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;
int
test_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;
}