Allocator.pro
TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
main.cpp \
allocuser.cpp
HEADERS += \
allocuser.h
allocuser.h
#ifndef ALLOCUSER_H
#define ALLOCUSER_H
#include <bitset>
using namespace std;
class AllocUser
{
private:
public:
AllocUser();
const static int maxItem = 1000;
const static int maxSize = 32;
static std::bitset<maxItem> bufmap;
static inline char buf[maxItem * maxSize];
static int freeblock;
template <typename T>
static T *allocate(void) {
int i;
static_assert( sizeof(T) < AllocUser::maxSize, "Max size for this allocator excessed " );
for(i=AllocUser::freeblock; i<AllocUser::maxItem; i++) {
if( !AllocUser::bufmap.test(i) )
break;
}
if( i==AllocUser::maxItem ) throw new bad_alloc();
AllocUser::bufmap.set(i, true);
AllocUser::freeblock=i+1;
return static_cast<T*> (new (&buf[AllocUser::maxSize*i]) T());
}
template <typename T>
static void deallocate(T *ptr) {
int i = ( ((char*)ptr)-&buf[0] )/maxSize;
// if( !bufmap.test(i) ) throw new logic_error("Wrong deallocate");
ptr->~T();
bufmap.set(i, false);
if( freeblock > i ) freeblock=i;
}
};
#endif // ALLOCUSER_H
allocuser.cpp
#include "allocuser.h"
using namespace std;
AllocUser::AllocUser()
{
std::bitset<maxItem> bufmap;
}
main.cpp
#include <iostream>
#include <allocuser.h>
#define MAX_SZ 32
#define MAX_ITEM 1000
using namespace std;
int AllocUser::freeblock=0;
int main()
{
cout << "Hello World!" << endl;
// AllocUser *allocu = new AllocUser ();
// int allocu->freeblock=0;
for(long i=0; i<1000; i++) {
for(int j=0; j<3; j++){
int *a = AllocUser::allocate<int>();
*a=5;
AllocUser::deallocate( a );
}
}
return 0;
}
Не вижу никакого отношения к какому-то "Template" - ваш класс шаблонным не является. Как обычно в большинстве таких случаев, в вашем коде нет определения std::bitset<maxItem> bufmap;.
Либо добавьте определение в .cpp файле
std::bitset<maxItem> AllocUser::bufmap;
Либо (более простой вариант исправления) - прямо в определении класса сделайте
static inline std::bitset<maxItem> bufmap;
То же относится и ко всем остальным статическим полям, кроме, возможно, const int полей.
Также не ясно, зачем вы применяете static_cast<T*> к указателю, который и так уже имеет тип T *.
Продвижение своими сайтами как стратегия роста и независимости