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

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;

}

直接在输入框内打的,如果排版或者逻辑错误别在意,意思到了就行了,请大家帮忙看看
...全文
294 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)
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 ### HSMS/SEMI通讯E37说明书中文关键知识点 #### 一、HSMS概述 - **HSMS**(High-Speed SECS Message Service)是一种专为半导体工厂内部计算机之间进行高速消息传输而构建的通信标准。该标准旨在逐步取代原有的SEMIE4(SECS-I)和SEMIE13(SECS Message Service),特别是在需要高速数据交换或简单的点对点拓扑结构无法满足实际需求的情况下。 - HSMS的核心宗旨在于提供一种机制,使来自不同制造商的设备能够达成无缝对接和互操作状态,即便这些设备在设计理念和通信机制上存在显著差异。 - HSMS不仅适用于TCP/IP优先于OSI模型的应用环境,同时也能作为SEMIE4和SEMIE13的有效替代方案。 #### 二、HSMS的应用范围 - HSMS主要部署于半导体制造业中的计算机系统之间进行消息交换的场景,如自动化生产线、设备监控系统等。 - 该标准界定了通信接口,使得半导体工厂内的各类设备能够实现高效且可靠的数据传输。 #### 三、HSMS与其他标准的关系 - **SEMIE4 (SECS-I)**:规定了消息传输的基本规则和格式。 - **SEMIE5 (SECS-II)**:明确了消息的具体内容和结构。 - **IETF Documents**: - RFC791 - Internet协议 - RFC792 - Internet控制消息协议 - RFC793 - 传输控制协议 - RFC1120 - Internet主机通信层的要求 - RFC1340 - 指定号码 - **POSIX D...
内容概要:本文系统研究了虚拟同步发电机(VSG)的惯量-阻尼协同自适应并网控制策略,旨在提升微电网在并网过程中的频率稳定性与动态响应能力。通过Simulink搭建VSG控制模型,结合Matlab实现算法仿真,深入分析了惯量与阻尼参数的自适应调节机制,并融合黑启动、预同步控制、虚拟阻抗等关键技术,有效增强了系统在电网频率波动下的鲁棒性与功率分配均衡性。研究不仅构建了完整的VSG双机并联仿真平台,还验证了所提控制策略在微电网黑启动、并网切换及负载突变等典型工况下的可行性与优越性,为新能源并网系统的稳定性控制提供了理论依据与技术支撑。; 适合人群:具备电力系统、自动化、电气工程等相关专业背景,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制、虚拟同步机技术、电力电子与电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握虚拟同步发电机的核心控制原理及其在微电网中的应用;②学习惯量与阻尼参数的协同自适应调控方法,提升系统频率响应性能;③通过Simulink搭建双机并联VSG系统,完成黑启动、预同步、功率均分等关键过程的仿真验证;④为科研论文复现、课题设计或实际工程项目提供可复用的模型与算法参考。; 阅读建议:建议读者结合文中所述仿真模型与代码资源,按照控制策略的设计流程逐步实践,重点关注参数整定、控制环路设计及系统稳定性判据的分析。推荐关注公众号“荔枝科研社”获取完整资料包,以便深入理解并拓展至更复杂的多源协同控制场景。

15,465

社区成员

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

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