【发布时间】:2018-08-18 06:16:20
【问题描述】:
我想限制一个类的实例数量。
我有以下代码:
class A {
static int cnt;
int x;
public:
A() {
cout<<"ctor called\n";
}
void* operator new(size_t size_in) {
if(cnt<=10) {
void *p=malloc(size_in);
if(p==NULL) {
throw bad_alloc();
} else {
cout<<"Memory allocation successful\n";
++cnt;
return p;
}
} else {
throw bad_alloc();
}
}
~A() {
cout<<"Cleaning up the mess\n";
}
};
int A::cnt=0;
int main() {
A *a[20];
for(int i=0;i<20;++i) {
try {
a[i]=new A();
} catch (bad_alloc &e) {
cout<<"Error in allocating memory\n";
}
}
try {
A b;
} catch (bad_alloc &e) {
cout<<"Error in allocating memory on stack\n";
}
return 0;
}
使用静态计数器并重载new 运算符,我可以限制Heap 上可以创建的对象数量。我还想限制在Stack 上创建的实例数量。一种方法是将构造函数设为私有并提供一个公共 API,该 API 首先检查计数器,然后相应地返回。
有没有其他方法可以做到这一点?
【问题讨论】:
-
请注意,您的解决方案在多线程程序中效果不佳。
-
是的,我同意。至于现在我只关注单线程环境
-
你的限制是创建的对象总数,还是一次的对象总数?每个解决方案略有不同。
-
如果你不讨厌 Singleton,你可以根据预设的实例数量来调整它。
-
@john 创建的对象总数,而不是一次。一次性限制对象的数量..我想我应该检查我要求的大小...正确如果我错了,我。