#include <iostream>
#include <set>
using namespace std;
class taco
{
static set<taco *> chain; // 自分自身のポインタを入れるstaticなコンテナ
private:
// コンストラクタ
taco()
{
// コンストラクタで自分自身のポインタをチェーンに追加
chain.insert(this);
}
~taco()
{}
public:
static taco * createinstance()
{
return new taco();
}
static size_t count()
{
return chain.size();
}
static void release()
{
typedef set<taco *>::iterator iterator;
for( iterator it = chain.begin(); it != chain.end(); )
{
iterator next = it;
++next;
delete *it;
chain.erase(it);
it = next;
}
//c++11からはこのように書ける。
//for( iterator it = chain.begin(); it != chain.end(); )
//{
//eraseは削除された位置の次の位置を指すイテレータを返す。
//it = chain.erase(it);
//}
}
};
// 静的メンバの実体
set<taco *> taco::chain;
int main()
{
// ポインタに紐付けしない
taco::createinstance();
taco::createinstance();
taco::createinstance();
taco::createinstance();
taco::createinstance();
cout << "there are " << taco::count() << " objects in the memory." << endl;
taco::release();
cout << "there are " << taco::count() << " objects in the memory." << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIHRhY28KewogICAgc3RhdGljIHNldDx0YWNvICo+IGNoYWluOyAvLyDoh6rliIboh6rouqvjga7jg53jgqTjg7Pjgr/jgpLlhaXjgozjgotzdGF0aWPjgarjgrPjg7Pjg4bjg4oKCnByaXZhdGU6CiAgICAvLyDjgrPjg7Pjgrnjg4jjg6njgq/jgr8KICAgIHRhY28oKQogICAgewogICAgICAgIC8vIOOCs+ODs+OCueODiOODqeOCr+OCv+OBp+iHquWIhuiHqui6q+OBruODneOCpOODs+OCv+OCkuODgeOCp+ODvOODs+OBq+i/veWKoAogICAgICAgIGNoYWluLmluc2VydCh0aGlzKTsKICAgIH0KCiAgICB+dGFjbygpCiAgICB7fQoKcHVibGljOgogICAgc3RhdGljIHRhY28gKiAgY3JlYXRlaW5zdGFuY2UoKQogICAgewogICAgICAgIHJldHVybiBuZXcgdGFjbygpOwogICAgfQoKICAgIHN0YXRpYyBzaXplX3QgY291bnQoKQogICAgewogICAgICAgIHJldHVybiBjaGFpbi5zaXplKCk7CiAgICB9CgogICAgc3RhdGljIHZvaWQgcmVsZWFzZSgpCiAgICB7CiAgICAgICAgdHlwZWRlZiBzZXQ8dGFjbyAqPjo6aXRlcmF0b3IgaXRlcmF0b3I7CiAgICAgICAgZm9yKCBpdGVyYXRvciBpdCA9IGNoYWluLmJlZ2luKCk7IGl0ICE9IGNoYWluLmVuZCgpOyApCiAgICAgICAgewogICAgICAgICAgICBpdGVyYXRvciBuZXh0ID0gaXQ7CiAgICAgICAgICAgICsrbmV4dDsKCiAgICAgICAgICAgIGRlbGV0ZSAqaXQ7CiAgICAgICAgICAgIGNoYWluLmVyYXNlKGl0KTsKCiAgICAgICAgICAgIGl0ID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgLy9jKysxMeOBi+OCieOBr+OBk+OBruOCiOOBhuOBq+abuOOBkeOCi+OAggogICAgICAgIC8vZm9yKCBpdGVyYXRvciBpdCA9IGNoYWluLmJlZ2luKCk7IGl0ICE9IGNoYWluLmVuZCgpOyApCiAgICAgICAgLy97CiAgICAgICAgICAgIC8vZXJhc2Xjga/liYrpmaTjgZXjgozjgZ/kvY3nva7jga7mrKHjga7kvY3nva7jgpLmjIfjgZnjgqTjg4bjg6zjg7zjgr/jgpLov5TjgZnjgIIKICAgICAgICAgICAgLy9pdCA9IGNoYWluLmVyYXNlKGl0KTsKICAgICAgICAvL30KICAgIH0KfTsKCi8vIOmdmeeahOODoeODs+ODkOOBruWun+S9kwpzZXQ8dGFjbyAqPiB0YWNvOjpjaGFpbjsKCgppbnQgbWFpbigpCnsKICAgIC8vIOODneOCpOODs+OCv+OBq+e0kOS7mOOBkeOBl+OBquOBhAogICAgdGFjbzo6Y3JlYXRlaW5zdGFuY2UoKTsKICAgIHRhY286OmNyZWF0ZWluc3RhbmNlKCk7CiAgICB0YWNvOjpjcmVhdGVpbnN0YW5jZSgpOwogICAgdGFjbzo6Y3JlYXRlaW5zdGFuY2UoKTsKICAgIHRhY286OmNyZWF0ZWluc3RhbmNlKCk7CgogICAgY291dCA8PCAidGhlcmUgYXJlICIgPDwgdGFjbzo6Y291bnQoKSA8PCAiIG9iamVjdHMgaW4gdGhlIG1lbW9yeS4iIDw8IGVuZGw7CgogICAgdGFjbzo6cmVsZWFzZSgpOwoKICAgIGNvdXQgPDwgInRoZXJlIGFyZSAiIDw8IHRhY286OmNvdW50KCkgPDwgIiBvYmplY3RzIGluIHRoZSBtZW1vcnkuIiA8PCBlbmRsOwp9Cg==