如何控制只存在一个类对象

daixuefeng203 2008-10-16 12:29:22
我写了个类,每次生成一个新对象时要new很大的空间(可能几百M)存储数据,

各个对象之间没有什么操作,我想每次程序创建新对象时把已创建的

对象delete,请问怎样来判断是否已存在的对象?

当然希望高手能提出更好的解决办法。

另,new分配的空间最大有多大?是不是就是内存大小?
...全文
129 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdef9108 2008-10-17
  • 打赏
  • 举报
回复


学习中。
jackzhhuang 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 daixuefeng203 的回复:]
其实我写的类十分的简单,只是生成对象时要开辟很大空间来存储数据块,并进行相应的处理

谢谢楼上各位的建议。
[/Quote]

如果空间很大,那就不是设计模式的问题了,试试用内存映像文件(CreateFileMapping,详见MSDN)。
yshuise 2008-10-16
  • 打赏
  • 举报
回复
这应该是你设计的问题。不是什么要一个对象实例的问题。
zhshgao 2008-10-16
  • 打赏
  • 举报
回复
如果只需要一个实例,那以前的不用delete,直接用以前的就行了。
用个static指针来标记已创建的对象,以后每次想获取就检查,如果指针不空,就直接返回存在的,不然就new。

new的最大空间应该不能超过本程序所在内存空间,一般好像是4G,这个值是可以改的。。

一个类就有几百M?
qhfu 2008-10-16
  • 打赏
  • 举报
回复
是:单件模式

new 分配能有多大,跟系统有关系,堆内存可以比较大。不过32位不会超过(4G的内存空间-系统固定的地址)?
xhs_lh04 2008-10-16
  • 打赏
  • 举报
回复
使用单例模式Singleton
qhfu 2008-10-16
  • 打赏
  • 举报
回复
单间模式
xxgamexx 2008-10-16
  • 打赏
  • 举报
回复

public class Spooler
{
static Spooler instance=null; //静态对象
public:
public static Spooler Instance
{
get
{
if (instance==null)
instance = new Spooler();
return instance;//返回静态对象给外围对象
}
}
public void release() //释放空间
{
if(instance!=null)
{
delete instance;
instance==null;
}
}
}

外围只需要通过Instance这个函数来申请空间并返回对象指针。
qjt1001 2008-10-16
  • 打赏
  • 举报
回复
学习一下
wudeshou82666 2008-10-16
  • 打赏
  • 举报
回复
同时也学习了
wudeshou82666 2008-10-16
  • 打赏
  • 举报
回复
学习
xxgamexx 2008-10-16
  • 打赏
  • 举报
回复
单间模式可能不方便

[Quote=引用 4 楼 zhshgao 的回复:]
如果只需要一个实例,那以前的不用delete,直接用以前的就行了。
用个static指针来标记已创建的对象,以后每次想获取就检查,如果指针不空,就直接返回存在的,不然就new。

new的最大空间应该不能超过本程序所在内存空间,一般好像是4G,这个值是可以改的。。

一个类就有几百M?
[/Quote]

这个我觉得可能好点
wudeshou82666 2008-10-16
  • 打赏
  • 举报
回复
写一个占几百M的类?

jackylea 2008-10-16
  • 打赏
  • 举报
回复
虽然看不懂,到此就顶下来,学习下
daixuefeng203 2008-10-16
  • 打赏
  • 举报
回复
其实我写的类十分的简单,只是生成对象时要开辟很大空间来存储数据块,并进行相应的处理

谢谢楼上各位的建议。
jackzhhuang 2008-10-16
  • 打赏
  • 举报
回复
如果一个类必须只有一个对象,请这么做:

1,把类的构造函数声明为private,这样杜绝了其他地方硬生生的创造一个对象。

2,在类里面声明一个静态成员函数,在里面用这个类的静态指针new这个类的对象出来,然后返回。
当然,在此之前要检查静态指针是否为空,不为空说明已经new过了,直接返回即可。

3,有new当然有delete,可以把需要只能有一个对象的类的指针封装起来,作为代理类的数据成员,由于指针每次获得对象都要通过上面所说的静态函数获得,这样保证了只有一个对象,而且在代理类的虚构函数中delete掉他,保证不会泄露内存,不会违规访问。

完美组合:singleton+proxy模式。

示例代码:
#include <iostream>

class Singleton
{
int m_nNew;

private:
Singleton():m_nNew(0)
{
std::cout << "singleton constructed" << ++m_nNew << "...\n";
}

public:
static Singleton * MakeSingleton()
{
static Singleton* pSingleton = NULL;

if (pSingleton != NULL)
{
return pSingleton;
}

pSingleton = new Singleton;

return pSingleton;
}
};

class Proxy
{
Singleton * m_pSingleton;

public:
Proxy():m_pSingleton(0)
{

}

Singleton * MakeSingleton()
{
m_pSingleton = Singleton::MakeSingleton();

return m_pSingleton;
}

~Proxy()
{
if (m_pSingleton != 0)
{
delete m_pSingleton;
m_pSingleton = NULL;
}
}
};

int main()
{
Proxy p;

Singleton * pSingleton1 = p.MakeSingleton();

Singleton * pSingleton2 = p.MakeSingleton();

getchar();
}


可以看到,singleton仅仅初始化了一次,而且main的代码根本不用管指针的delete,完全交给了Proxy。
xqhrs232 2008-10-16
  • 打赏
  • 举报
回复
学习一下。
lbzhao_28 2008-10-16
  • 打赏
  • 举报
回复
单件模式可以的.
你可以考虑建立一个对象数组(链表),新的对象实例化的时候先检查数组(链表)的状况.

楼主为什么做这么大的对象?要几百M,不能多拆开几个吗?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧