多线程中多次new同一个指针对象的有关问题
多线程中多次new同一个指针对象的问题

class CThreadParam //定义线程参数
{
public:
HANDLE hHandle; //线程句柄
CMultiTaskDlg *pDlg; //主窗口指针
int nPos; //对应任务列表中的位置
BOOL bStop; //线程是否停止
CThreadParam()
{
bStop = FALSE;
}
};
如图,是一个多线程的程序界面,每次点击新任务,都触发下面的程序
void CMultiTaskDlg::OnNewTask()
{
//创建新任务
CThreadParam* pParam = new CThreadParam;//这里每次都new一个CThreadParam可以吗?不会造成内存泄漏等问题????
pParam->pDlg = this;
int nCount = m_TaskList.GetItemCount();
int nPos = m_TaskList.InsertItem(nCount, "任务", 0);
CString szText;
szText.Format("任务%d", nPos);
m_TaskList.SetItemText(nPos, 0, szText);
m_TaskList.SetItemText(nPos, 2, "进行中...");
pParam->nPos = nPos;
pParam->hHandle = CreateThread(NULL, 0, TaskProc, pParam, 0, NULL);
m_HandleList.AddHead(pParam);
}
//下面是线程函数
DWORD __stdcall TaskProc(LPVOID lpParameter) //线程函数
{
CThreadParam Param;
memcpy(&Param, (CThreadParam *)lpParameter, sizeof(CThreadParam));
char szCounter[10] = {0};
int nPos = 0;
POSITION pos;
BOOL bTerminate = FALSE;
for(int i=0; i<500; i++)
{
memset(szCounter, 0, 10);
itoa(i, szCounter, 10);
Param.pDlg->FindItemPos(Param.hHandle, nPos, pos, bTerminate);
if (nPos != -1)
{
Param.pDlg->m_TaskList.SetItemText(nPos, 1, szCounter);
}
if (bTerminate)
{
goto label; //goto label;
}
Sleep(100); //延时,演示任务进行中
}
}
我是新手,可能我的想法是错的,我觉得每次new一个,自然应该delete,但是在这个多线程中,每次new一次再delete,就不能实现界面中新建任务的要求,但是又觉得new一个应该有对应的delete。所以一直对这段程序代码有疑惑
难道new一次,不一定要delete????
------解决方案--------------------
new和delete当然要一一对应,但可以在其它地方delete.比如在你每个线程结束的时候。
或者你不怕内存涨得太多,可以在程序退出的时候,因为我看你有把结果放在m_HandleList。
如果是在线程退出的时候delete掉了,那么你就不要放在m_HandleList里,因为这时已经是野指针了
------解决方案--------------------
单线程是多线程的一种特殊情况,同样也可以这样,为什么不可以,一个函数中new一个指针,不一定得在该函数中delete,比如链表节点,按照需要调用一个函数n次,new了n个节点,当不再使用该链表的时候,一起销毁所有的节点
只要你new出来的内存是可以跟踪的,就不一定在下次new之前需要delete
class CThreadParam //定义线程参数
{
public:
HANDLE hHandle; //线程句柄
CMultiTaskDlg *pDlg; //主窗口指针
int nPos; //对应任务列表中的位置
BOOL bStop; //线程是否停止
CThreadParam()
{
bStop = FALSE;
}
};
如图,是一个多线程的程序界面,每次点击新任务,都触发下面的程序
void CMultiTaskDlg::OnNewTask()
{
//创建新任务
CThreadParam* pParam = new CThreadParam;//这里每次都new一个CThreadParam可以吗?不会造成内存泄漏等问题????
pParam->pDlg = this;
int nCount = m_TaskList.GetItemCount();
int nPos = m_TaskList.InsertItem(nCount, "任务", 0);
CString szText;
szText.Format("任务%d", nPos);
m_TaskList.SetItemText(nPos, 0, szText);
m_TaskList.SetItemText(nPos, 2, "进行中...");
pParam->nPos = nPos;
pParam->hHandle = CreateThread(NULL, 0, TaskProc, pParam, 0, NULL);
m_HandleList.AddHead(pParam);
}
//下面是线程函数
DWORD __stdcall TaskProc(LPVOID lpParameter) //线程函数
{
CThreadParam Param;
memcpy(&Param, (CThreadParam *)lpParameter, sizeof(CThreadParam));
char szCounter[10] = {0};
int nPos = 0;
POSITION pos;
BOOL bTerminate = FALSE;
for(int i=0; i<500; i++)
{
memset(szCounter, 0, 10);
itoa(i, szCounter, 10);
Param.pDlg->FindItemPos(Param.hHandle, nPos, pos, bTerminate);
if (nPos != -1)
{
Param.pDlg->m_TaskList.SetItemText(nPos, 1, szCounter);
}
if (bTerminate)
{
goto label; //goto label;
}
Sleep(100); //延时,演示任务进行中
}
}
我是新手,可能我的想法是错的,我觉得每次new一个,自然应该delete,但是在这个多线程中,每次new一次再delete,就不能实现界面中新建任务的要求,但是又觉得new一个应该有对应的delete。所以一直对这段程序代码有疑惑
难道new一次,不一定要delete????
------解决方案--------------------
new和delete当然要一一对应,但可以在其它地方delete.比如在你每个线程结束的时候。
或者你不怕内存涨得太多,可以在程序退出的时候,因为我看你有把结果放在m_HandleList。
如果是在线程退出的时候delete掉了,那么你就不要放在m_HandleList里,因为这时已经是野指针了
------解决方案--------------------
单线程是多线程的一种特殊情况,同样也可以这样,为什么不可以,一个函数中new一个指针,不一定得在该函数中delete,比如链表节点,按照需要调用一个函数n次,new了n个节点,当不再使用该链表的时候,一起销毁所有的节点
只要你new出来的内存是可以跟踪的,就不一定在下次new之前需要delete