1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
/////////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 <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/preprocessor/stringize.hpp>
#include BOOST_PP_STRINGIZE(BOOST_ARCHIVE_TEST)
#include <boost/detail/no_exceptions_support.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;
++i;
bool b = false;
if(i == 2)
b = true;
ar >> BOOST_SERIALIZATION_NVP(next_);
if(b)
boost::throw_exception(0);
}
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);
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);
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;
}
|