问个new/delete的问题

3m2u 2011-07-22 12:31:12
为了启动管理多个不同的线程,我定义了一个结构
{
HANDLE hThread;
LPARAM lParam ;
...
}
lParam是线程需要的数据,有个线程我要传2个字符串进去,用了以下方法:
CString *ptr = new CString[2];
ptr[1] = str1;
ptr[2] = str2;
para.lParam = (LPARAM) ptr;
当希望传入别的数据的时候new其它的类型,在线程内去解析lParam
线程获取/使用这些数据是没有问题的
在线程结束的时候就有问题了,因为需要delete lParam对应的内容
而实际上lParam不一定是什么类型,也许是CString* 也许是 MyStruct*
直接delete [] (char*)lParam 会报错。
如果在开始的时候都统一用char*来申请内存,像下面这样:
char * buf = new char[sizeof(CString)*2];
char * ptr = (CString*)buf;
ptr[1] = str1;
ptr[2] = str2;
这样赋值的时候又会报错。

怎么解决这样的问题比较好呢?
...全文
199 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-08-02
  • 打赏
  • 举报
回复
用联合体
通过一个标识标记这个union的类型
准备释放的时候判断一下即可
q1q2q3q4ln 2011-08-02
  • 打赏
  • 举报
回复
so easy!
你加个类型
删除的时候根据类型判断
如何删除
fyz2841585 2011-07-29
  • 打赏
  • 举报
回复
路过学下
buyong 2011-07-25
  • 打赏
  • 举报
回复
delete [] lParam 行不行?
eryadabendan 2011-07-25
  • 打赏
  • 举报
回复
学习中
呔妖怪来嘛 2011-07-22
  • 打赏
  • 举报
回复
我说的是lParam 参数用结构
3m2u 2011-07-22
  • 打赏
  • 举报
回复
本来是结构啊
本来是想用个lParam保存各种指针,到最后统一删除,不管原来是什么类型的
但实践的结果是 new CString * 必须也得 delete CString*类型的指针
呔妖怪来嘛 2011-07-22
  • 打赏
  • 举报
回复
用结构?
S_S_Ge 2011-07-22
  • 打赏
  • 举报
回复
学习下
liuyiliang8 2011-07-22
  • 打赏
  • 举报
回复
为什么是:
ptr[1] = str1;
ptr[2] = str2;
而不是ptr[0]和ptr[1]
virtualfunction 2011-07-22
  • 打赏
  • 举报
回复
传递下面式样的结构指针给线程:
typedef struct _MYDATA
{
int nCode; // 指定pObject的类型,以便准确删除
void *pObject; // 由nCode指定类型的指针
}MYDATA,*PMYDATA;
3m2u 2011-07-22
  • 打赏
  • 举报
回复
这是要传给线程的数据啊。子线程怎么能自己分配
sctianhu 2011-07-22
  • 打赏
  • 举报
回复
CString *ptr = new CString[2];
ptr[1] = str1;
ptr[2] = str2;
para.lParam = (LPARAM) ptr;

你这里new出来的数据在你主线程(创建别的线程的线程)要使用吗,如果不使用为什么不传递比如 枚举,让子线程负责自己分配空间自己释放呢?

3m2u 2011-07-22
  • 打赏
  • 举报
回复
呵呵,回复还很多。我再说一下吧。
因为要为不同目的创建不同的线程,有很多参数是共同的,有一些又是不同的。
所以我定义 了一种struct,但里面有一部分参数(lParam)是可以自定义的。
而线程创建后函数就返回了,传入的参数应该单独申请内存,而不能用临时变量。
这段内存什么时候用完,不再使用了,是后面的事。所以上面说的谁申请谁删除不太适用。
因为创建进程的函数早就返回了。
所以每个进程结束时都会需要删除这部分数据,我是希望能统一的删除。
我想最好的办法 还是不管lParam存什么样的值,我还是new 简单的char
把整数也好,字符串也好都放里。
不用CString这样的高级东西。
haogeai123 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hezhe1008 的回复:]
我说的是lParam 参数用结构
[/Quote]++




wltg2001 2011-07-22
  • 打赏
  • 举报
回复
你只要遵守一个原则,谁申请谁释放就行了。
pengzhixi 2011-07-22
  • 打赏
  • 举报
回复
而 一条原则是哪个分配的那么就应该那个负责释放,比如你主线程分配,那么你传进给其他线程后 等其他线程用完,主线程负责释放,就不会有你说的那个问题了。

char * buf = new char[sizeof(CString)*2];
CString * ptr = (CString*)buf;//猜测楼主应该是这样
ptr[1] = str1;
ptr[2] = str2;
这里为什么会发生赋值错误。因为ptr[1]根本就不是CString类型。原因是 这段原始分配的内存,你根本就没有调用过CString的构造函数,那么你凭什么直接赋值呢?
你可以new(ptr)CString(str1);使用placement new。但是还有一个问题就是你最初分配的buf是否符合CString的内存对齐要求。这也是一个问题。所以你还是按照最开始说的那样去做
Jimmy_Xia 2011-07-22
  • 打赏
  • 举报
回复
CStringArray myDataArray;//可以是全局的
myDataArray.Add(str1);//添加数据
myDataArray.Add(str2);
//将myDataArray以指针的方式传递进去
//如果是有多个线程使用这个对象,需要加并发访问控制。

HANDLE hMyThread= NULL;
UINT ThreadID;
hMyThread =
CreateThread(NULL,0,ThreadProc,(LPVOID)&myDataArray,0, &ThreadID);

DWORD WINAPI ThreadProc(LPVOID pParam)
{
CStringArray* pMyDataArray = (CStringArray*)pParam;
CString str1 = pMyDataArray->GetAt(0);
CString str2 = pMyDataArray->GetAt(1);
return 0;
}

youngwolf 2011-07-22
  • 打赏
  • 举报
回复
delete[] ss;
以后,开始线程里面的工作,而不是在线程结束的时候delete[] ss;
如果你担心内存浪费的话。
youngwolf 2011-07-22
  • 打赏
  • 举报
回复
主线程你就new一个足够大的char[]数组不就行了!不用担心内存浪费,如果你担心浪费,在线程里面再去出来放到CString里面,然后马上delete[]掉char[]数组即可。比如:

char ss[1024 * 1024]; //足够大了
strcpy(ss, str1);
strcpy(ss + 1024, str2);

para.lParam = (LPARAM) ss;

线程里面:
const char* ss = (const char*) para.lParam;
CString str1 = ss;
CString str2 = ss + 1024;

delete[] ss;
加载更多回复(6)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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