problems with object pool in ch17
I print the words following the book,it compiled OK,linked OK,but it doesn't work as i expected.in class UserRequest,there is a static var named data,i use ++data in ctor to mark different objects.then in while loop using cout to show the different objects ,but they all print the same object.i was confused where were my objects...
code followed:
//ObjectPool.h
#include <queue>
#include <vector>
#include <stdexcept>
#include <memory>
using std::queue;
using std::vector;
template <typename T>
class ObjectPool
{
public:
ObjectPool(int chunkSize)
throw(std::invalid_argument,std::bad_alloc);
~ObjectPool();
T& acquireObject();
void releaseObject(T& obj);
queue<T*> mFreeList;
vector<T*> mAllObjects;
int mChunkSize;
protected:
static const int kDefaultChunkSize = 10;
void allocateChunk();
static void arrayDeleteObject(T* obj);
private:
ObjectPool(const ObjectPool<T>& obj);
ObjectPool<T> operator=(const ObjectPool<T>& ths);
};
#include "ObjectPools.h"
//ObjectPools.h function definition
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename T>
ObjectPool<T>::ObjectPool(int chunkSize) throw(std::invalid_argument,std::bad_alloc) : mChunkSize(chunkSize)
{
if (mChunkSize <= 0) {
throw std::invalid_argument("chunk size must be opsitive");
}
allocateChunk();
}
template <typename T>
void ObjectPool<T>::allocateChunk()
{
T* newObjects = new T[mChunkSize];
mAllObjects.push_back(newObjects);
for (int i = 0; i < mChunkSize; i++) {
mFreeList.push(&newObjects[i]);
}
}
template <typename T>
void ObjectPool<T>::arrayDeleteObject(T *obj)
{
delete [] obj;
}
template <typename T>
ObjectPool<T>::~ObjectPool()
{
for_each(mAllObjects.begin(),mAllObjects.end(),arr ayDeleteObject);
}
template <typename T>
T& ObjectPool<T>::acquireObject()
{
if (mFreeList.empty()) {
allocateChunk();
}
T* obj = mFreeList.front();
mFreeList.pop();
// cout << "return:" << obj << endl;
return *obj;
}
template <typename T>
void ObjectPool<T>::releaseObject(T& obj)
{
mFreeList.push(&obj);
}
//UserRequest.h
class UserRequest
{
public:
[u] UserRequest() { ++data; }</u>
~UserRequest() {}
[u] int get() { return data; }</u>
protected:
[u] static int data;</u>
};
int UserRequest::data = 0;
//main cpp
// ObjectPool.cpp : ¶¨Ãå¿ÃÃÃèæÃóÃÃòµÃÃë¿Ãµ ã¡£
//
#include "stdafx.h"
#include "ObjectPool.h"
#include "UserRequest.h"
#include <vector>
#include <iostream>
#include <windows.h>
using namespace std;
UserRequest& obtainUserRequest(ObjectPool<UserRequest>& pool)
{
UserRequest& request = pool.acquireObject();
[u] cout << "required data:" << request.get() << endl;</u>
return request;
}
void processUserRequest(ObjectPool<UserRequest>& pool, UserRequest& req)
{
// pool.releaseObject(req);
[u] cout << "data " << req.get() << " released" << endl;</u>
}
int _tmain(int argc, _TCHAR* argv[])
{
ObjectPool<UserRequest> requestPool(100);
/*
while (true) {
[u] Sleep(100);</u> UserRequest& req = obtainUserRequest(requestPool);
[u] cout << "UserRequest:" << req.get() << endl;
// cout << "ojbpool:" << requestPool.mFreeList.back()->get() << endl;</u> cout << "mChunkSize:" << requestPool.mChunkSize << endl;
processUserRequest(requestPool, req);
}
[u] vector<UserRequest*>::iterator it= requestPool.mAllObjects.begin();
for (size_t i = 0; i < requestPool.mAllObjects.size(); i++) {
cout << (*it)->get() << endl;
if (it != requestPool.mAllObjects.end()) {
++it;
} else {
cout << "it is the end of vector!" << endl;
}
}*/
cout << (*requestPool.mAllObjects.begin())->get() << endl;
cout << (*(requestPool.mAllObjects.end()-1))->get() << endl;
cout << "queue size :" << requestPool.mFreeList.front()->get() << endl;
cout << "queue size :" << (requestPool.mFreeList.front()+1000)->get() << endl;</u>
//forward was when debugging
return 0;
}
waiting for your proffessional explaination and thanks.
fight now,date in future.
__________________
fight now,date in future.
|