// 26_26-13.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <cstdlib>

using namespace std;

class XYpos {
private:
	int x, y;
public:
	XYpos(int n1 = 0, int n2 = 0) { x = n1; y = n2; }
	void set(int n1, int n2) { x = n1; y = n2; }
	void disp() { cout << "(" << x << "," << y << ")\n"; }
	void *operator new(size_t memsize);
	void *operator new[](size_t memsize);
	void operator delete(void *p);
	void operator delete[](void *p);
};

void *XYpos::operator new(size_t memsize)
{
	void *p;
	cout << "----new memsize=" << memsize << '\n';
	if (p = malloc(memsize)) {
		return p;
	}
	throw bad_alloc();
}

void *XYpos::operator new[](size_t memsize)
{
	void *p;
	cout << "----new[] memsize=" << memsize << '\n';
	if (p = malloc(memsize)) {
		return p;
	}
	throw bad_alloc();
}

void XYpos::operator delete(void *p)
{
	cout << "----delete\n";
	free(p);
}

void XYpos::operator delete[](void *p)
{
	cout << "----delete[]\n";
	free(p);
}

int _tmain(int argc, _TCHAR* argv[])
{
	XYpos *p1, *p2;

	try {
		p1 = new XYpos(10, 20);
		p2 = new XYpos[4];
	}
	catch (bad_alloc) {
		cout << "メモリ確保できません";
		return 1;
	}

	p1->disp();
	(p2+3)->set(30, 40);
	(p2+3)->disp();

	delete p1;
	delete[] p2;

	MessageBox(NULL, _T("Check Console Window"), L"MessageBox", MB_OK);

	return 0;
}

