关于内存释放问题!!不确定,想问清楚下!

wliaoc 2010-07-26 10:06:16
先定义了一个全局数组,int array[10];

我在中断函数中
{
int *p = new int [10];
//这里我现在是随便赋值
for(...)
{
*(p+i) = i;
}
PostThreadMessage(*p,10);//把p送给消息处理
//是这里释放p呢?
delete [] p;
p = NULL;

}

//对应消息处理函数,简单化了
message(w,l);
{
int *k = (int *)W;
for(...)
{
array[i] = *(k+i);
}
delarray();//数据处理函数
//还是这里处理
//delete [] k;
//k = NULL;

}

直接在输入框内打的,如果排版或者逻辑错误别在意,意思到了就行了,请大家帮忙看看
...全文
226 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
wliaoc 2011-02-10
  • 打赏
  • 举报
回复
不好意思,很久没上,忘给分了。谢谢大家!!
不说害怕 2010-07-27
  • 打赏
  • 举报
回复
struct array
{
int* data;
int cout;
}
bool freearray(array* arr)
{
delete [] arr.data;
delete arr;
}
arraya* x = new array;
x.data = new int[10];
x.cout = 10;
PostThreadMessage((WPARAM)x,(LPARAM)freearray);

类似这么个思想..楼主可以考虑一下.
不说害怕 2010-07-27
  • 打赏
  • 举报
回复
1. PostThreadMessage 发送可以失败.要判断是否成功.
2. 即使发送成功也要等用完了才删除..具体怎么知道用完了.有很多方法.
3. 可以由接收线程来释放内存,但释放内存的函数指针可以通过PostThreadMessage发送给目的消息处理线程.
由目的消息线程同时获得 [内存]和[释放内存的方法].
因为申请内存的方法多种多样,释放内存的方法也多种多样.这个需要配对.
我的想法是,谁申请的内存,它必须同时给出一个函数来释放内存.
谁来释放,都没问题.但需要解决同步..假如由接收线程来释放,那不需要考虑同步.但需要告诉接收线程如何释放内存.
就是传递上面提到的一个释放内存函数.
lazy_2010 2010-07-27
  • 打赏
  • 举报
回复
用一个函数,同时创建 10 个线程也是可以的,你可以看看别的 csdn 的帖子。

实际需要什么特殊处理,要看你的项目是否需要了。
askhe 2010-07-27
  • 打赏
  • 举报
回复
PostThreadMessage 是异步的。所以你不能保证 那个内存对方已经使用完毕了,所以你Delete会导致错误的。
sunlin7 2010-07-27
  • 打赏
  • 举报
回复
典型的所有权问题,在多模块程序设计常见,即哪里申请,何处释放的问题。

对于楼主所述的postmessage这种情况,建议使用资源池,标记各个资源,当资源不够时添加资源,当空闲资源超过一定数时释放资源即可。
wliaoc 2010-07-27
  • 打赏
  • 举报
回复
不同中断,相当于两个线程,可以同时用一个消息处理吗?不用加特殊处理?
gz_qmc 2010-07-26
  • 打赏
  • 举报
回复
永远记住:
new一块内存
等同于坐公共汽车抢位置

你朋友没上来
但你要为他占位置
那么你就要告诉别人说:这里已经有人了

如果你delete了,就等于说:这里没有人
如果这时候别人坐了,就等于内容不是你想的内容了.

所以你应该是在你朋友不需要了后(比如下车)才宣布
否则查票员说:62号座位的同志请买票,你买还是不买?
adamwyb 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wliaoc 的回复:]
我在中断函数中,从外部接收到一个数组,int Rec[20]
{
int *p = new int [10];
//这里我现在是随便赋值
for(i=0;i<10;i++)
{
*(p+i) = Rec[i];
}
PostThreadMessage((WPARAM)p,10);//把p送给消息处理
int *t = new int [10];
/……
[/Quote]

没有什么问题,只是要在合适的时候释放掉内存。就是担心在没有用之前就释放了,会导致程序计算结果出错,甚至崩溃。
wltg2001 2010-07-26
  • 打赏
  • 举报
回复
当然是第二种,第一种一定出错。
lazy_2010 2010-07-26
  • 打赏
  • 举报
回复
没有啥明显的问题,除非你消息处理函数存在问题。线程可以处理多个相同 ID 的消息
wliaoc 2010-07-26
  • 打赏
  • 举报
回复
我在中断函数中,从外部接收到一个数组,int Rec[20]
{
int *p = new int [10];
//这里我现在是随便赋值
for(i=0;i<10;i++)
{
*(p+i) = Rec[i];
}
PostThreadMessage((WPARAM)p,10);//把p送给消息处理
int *t = new int [10];
//这里我现在是随便赋值
for(i=0;i<10;i++)
{
*(t+i) = Rec[i+10];
}
PostThreadMessage((WPARAM)t,10);//把t送给消息处理
}
后面处理一样,用同一个消息处理,会有问题吗?
wliaoc 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gz_qmc 的回复:]
PostThreadMessage(*p,10);这句有问题,光传一个数没有用
要传地址PostThreadMessage((WPARAM)p,10);
[/Quote]

实际代码里就是这么传的
现在应该清楚了,用第二种。
m_tornado 2010-07-26
  • 打赏
  • 举报
回复
如果硬要选一个,第二种比较合适~
m_tornado 2010-07-26
  • 打赏
  • 举报
回复
看了那段代码总有些自己办事了要别人擦屁股的感觉~
m_tornado 2010-07-26
  • 打赏
  • 举报
回复
觉得两种各有弊端
1.new了之后没有看见成对的delete,代码给别人的使用,很容易被误解。
2.delete的很无厘头,也不是很安全。

最好不要用这样的方式传递
宁愿写一个全局的类
构造里new ,析构里delete
看你的代码你也不介意全局数据~
Simao 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gz_qmc 的回复:]
在中断里不要delete [] p;要保留该内存和其数据被锁定.不能释放.

PostThreadMessage(*p,10);这句有问题,光传一个数没有用
要传地址PostThreadMessage((WPARAM)p,10);

在处理数据完成的地方删除
delarray();//数据处理函数
delete [] k;
[/Quote]

Up
secretcf 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 blukercn 的回复:]

要看PostThreadMessage是否成功,成功就在线程free,失败就马上free
[/Quote]

正解!
漫步者、 2010-07-26
  • 打赏
  • 举报
回复
选择第二种,因为你的指针还在继续使用!
gz_qmc 2010-07-26
  • 打赏
  • 举报
回复
在中断里不要delete [] p;要保留该内存和其数据被锁定.不能释放.

PostThreadMessage(*p,10);这句有问题,光传一个数没有用
要传地址PostThreadMessage((WPARAM)p,10);

在处理数据完成的地方删除
delarray();//数据处理函数
delete [] k;
加载更多回复(7)

15,471

社区成员

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

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