问一个大块内存操作的问题。

chenmu_2002 2005-08-24 09:47:42
我定义了一个结构:
struct FRIEND_INFO
{
int nFace;
CString strFriendID;
CString strFriendName;
CString strJob;
FRIEND_INFO& operator = (const FRIEND_INFO& set)
{
nFace = set.nFace;
strFriendID = set.strFriendID;
strFriendName = set.strFriendName;
strJob = set.strJob;
}
};

FRIEND_INFO * m_pFriend;
int m_nFriendItems;

m_nFriendItems的个数不定,一般活跃用户在400以上。
m_pFriend = new FRIEND_INFO[m_nFriendItems];

在接收到一些网络消息的情况下,会做如下操作:
void OnUserAdd(CString strFriendID, CString strFriendName)
{
FRIEND_INFO * temp = new FRIEND_INFO[m_nFriendItems+1];
for(int i=0;i<m_nFriendItems;i++)
temp[i] = m_pFriend[i];
delete[] m_pFriend;
m_pFriend = temp;

m_pFriend[m_nFriendItems].strFriendID = strFriendID;
....
m_nFriendItems++;
}

由于接收到网络消息后是以PostMessage来处理。
对这片内存的处理可能会有两个线程同时处理的问题,我应该怎么做来避免这种问题的发生。
还有大内存如果有比较频繁的new 和 delete 会有问题吗?
谢谢
...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
DentistryDoctor 2005-08-24
  • 打赏
  • 举报
回复
使用临界区同步,memory pool提高内存分配释放的效率
goodboyws 2005-08-24
  • 打赏
  • 举报
回复
OnUserAdd需要加临界区
CRITICAL_SECTION m_section;
InitializeCriticalSection(§ion);
......
void OnUserAdd(CString strFriendID, CString strFriendName)
{
EnterCriticalSection(§ion);
if (m_nFriendItems >= g_iBufferSize)
{
FRIEND_INFO * temp = new FRIEND_INFO[g_iBufferSize+BUFFER_BLOCK_SIZE];
for(int i=0;i<m_nFriendItems;i++)
temp[i] = m_pFriend[i];
delete[] m_pFriend;
m_pFriend = temp;
}
m_pFriend[m_nFriendItems].strFriendID = strFriendID;
....
m_nFriendItems++;
LeaveCriticalSection(&m_section);
}

to booklove
因为楼主的struct包含类成员, HeapAlloc/Free可能会有构造/析构未被调用的问题
chenmu_2002 2005-08-24
  • 打赏
  • 举报
回复
申请一片固定的大内存是我最无奈的方法,因为实际操作中极有可能会突破,个别用户的m_nFriendItems已经突破了1500。

目前我最想知道是两个线程同时处理的问题,我应该怎么做来避免这种问题的发生。因为系统偶尔会崩溃,提示出在temp[i] = m_pFriend[i];而temp和m_pFriend的又都没有遭到破坏,所以我怀疑是由于两个线程同时操作引起的,当然,这只是猜测,还请高手答疑。
longyii 2005-08-24
  • 打赏
  • 举报
回复
不要每次都删除全部已存在的用户记录,数据结构采用链表,只需增加新用户结点即可
booklove 2005-08-24
  • 打赏
  • 举报
回复
申请一块足够大的内存,每次都用,就像楼上的。
还有 HeapAlloc, HeapFree 好点吧。
goodboyws 2005-08-24
  • 打赏
  • 举报
回复
这样做
#define BUFFER_BLOCK_SIZE 500
FRIEND_INFO * m_pFriend;
int m_nFriendItems;

m_pFriend = new FRIEND_INFO[BUFFER_BLOCK_SIZE];
INT g_iBufferSize = BUFFER_BLOCK_SIZE;

在接收到一些网络消息的情况下,会做如下操作:
void OnUserAdd(CString strFriendID, CString strFriendName)
{
if (m_nFriendItems >= g_iBufferSize)
{
FRIEND_INFO * temp = new FRIEND_INFO[g_iBufferSize+BUFFER_BLOCK_SIZE];
for(int i=0;i<m_nFriendItems;i++)
temp[i] = m_pFriend[i];
delete[] m_pFriend;
m_pFriend = temp;
}
m_pFriend[m_nFriendItems].strFriendID = strFriendID;
....
m_nFriendItems++;
}
chenmu_2002 2005-08-24
  • 打赏
  • 举报
回复
对了,我的程序是客户端,以上是客户端接收的网络消息
chenmu_2002 2005-08-24
  • 打赏
  • 举报
回复
有没有相关的文档或源码可看吗?多谢指点
i_noname 2005-08-24
  • 打赏
  • 举报
回复
内存池
alphapaopao 2005-08-24
  • 打赏
  • 举报
回复
显然不要频繁new delete, 你应该使用缓冲池技术。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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