C++程序  |  119行  |  1.81 KB

/**
 * @file utility_tests.cpp
 * tests utility.h and op_exception.h
 *
 * @remark Copyright 2003 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#include <stdlib.h>
#include <new>
#include <iostream>

#include "utility.h"
#include "op_exception.h"

using namespace std;

static int nb_new;
static int nb_new_array;

void* operator new(size_t size) throw(bad_alloc)
{
	nb_new++;
	return malloc(size);
}

void* operator new[](size_t size) throw(bad_alloc)
{
	nb_new_array++;
	return malloc(size);
}

void operator delete(void * p) throw()
{
	nb_new--;
	if (p)
		free(p);
}

void operator delete[](void * p) throw()
{
	nb_new_array--;
	if (p)
		free(p);
}


void check_alloc()
{
	if (nb_new) {
		cerr << "new(size_t) leak\n";
		exit(EXIT_FAILURE);
	}

	if (nb_new_array) {
		cerr << "new[](size_t) leak\n";
		exit(EXIT_FAILURE);
	}
}


struct A {};

template <typename Throw, typename Catch>
void throw_tests()
{
	scoped_ptr<A> a(new A);
	try {
		scoped_ptr<A> a(new A);
		throw Throw("");
	}
	catch (Catch const &) {
	}
}


template <typename Throw, typename Catch>
void throw_tests(bool)
{
	scoped_array<A> b(new A[10]);
	try {
		scoped_array<A> a(new A[10]);
		throw Throw("");
	}
	catch (Catch const &) {
	}
}


void tests_new()
{
	throw_tests<op_fatal_error, op_fatal_error>();
	throw_tests<op_fatal_error, op_exception>();
	throw_tests<op_runtime_error, op_runtime_error>();
	throw_tests<op_runtime_error, runtime_error>();
	throw_tests<op_fatal_error, op_fatal_error>(true);
	throw_tests<op_fatal_error, op_exception>(true);
	throw_tests<op_runtime_error, op_runtime_error>(true);
	throw_tests<op_runtime_error, runtime_error>(true);
}


int main()
{
	try {
		tests_new();
		check_alloc();
	}
	catch (...) {
		cerr << "unknown exception\n";
		return EXIT_FAILURE;
	}

	return EXIT_SUCCESS;
}