各位国庆加班的大大:如何销毁结构体里的非托管成员?

问题描述

ImportsSystem.Runtime.InteropServicesModuleModule1'//注意这个属性不能少:允许您控制类或结构的数据字段的物理布局。'//指示可序列化'//按1字节对齐<Serializable()>_<StructLayout(LayoutKind.Sequential,Pack:=1)>_PublicStructure_OperatorDimidAsUShort'//声明一个字符数组,大小为11<MarshalAs(UnmanagedType.ByValArray,SizeConst:=11)>_Dimname()AsChar<MarshalAs(UnmanagedType.ByValArray,SizeConst:=9)>_Dimpass()AsChar'  publicchar[]pass;PublicSharedFunctionCreateInstance(ByValuserIDAsUShort,ByValuserNameAsString,ByValpasswordAsString)As_OperatorDimresultAsNew_Operatorresult.id=userIDresult.name=userName.ToArray()result.pass=password.ToArray()ReturnresultEndFunctionPublicSharedFunctionDestroyInstance(ByValuserIDAsUShort,ByValuserNameAsString,ByValpasswordAsString)As_Operator'如何销毁非托管成员?EndFunctionEndStructureEndModule

从C#抄来的代码,有如下问题不明:问题1:结构体中的非托管成员是否需要销毁?在过程中生成结构体实例,过程调用完成后,结构体中的非托管成员是否会自行销毁?问题2:如果要销毁非托管成员,如何写销毁的代码?成员=nothing?

解决方案

解决方案二:
请你先解释一下,什么叫做“销毁”?如果你说是释放内存空间,那么你什么也不用做,GC自然就会释放。可惜,真正的“销毁”根本不是释放空间这个意思。是有些人在误导。
解决方案三:
引用1楼sp1234的回复:

请你先解释一下,什么叫做“销毁”?如果你说是释放内存空间,那么你什么也不用做,GC自然就会释放。

就是清除使用过的内存空间,并将之释放,供别的程序使用。由于使用的是非托管的数据类型,担心GC管不到。我的代码有大量的包函非托管的数据类型的结构体,用来传送Socket数据,现在出现不明原因的崩溃,所以怀疑是这个原因导致内存泄漏。引用1楼sp1234的回复:

可惜,真正的“销毁”根本不是释放空间这个意思。是有些人在误导。

对于这些别有用心的人,我代表广东人民表示:“呵呵!”
解决方案四:
非托管资源需要销毁.GC不管的。不建议在struct中加入非托管资源的成员,建议使用class.正统销毁非托管资源的方法是实现IDispose接口,然后用到class的地方使用using。下面的msdn页面有使用和实现IDispose接口的例子和解释:IDisposableInterface
解决方案五:
你的结构不涉及非托管资源,销毁也无从谈起
解决方案六:
引用3楼findcaiyzh的回复:

非托管资源需要销毁.GC不管的。不建议在struct中加入非托管资源的成员,建议使用class.正统销毁非托管资源的方法是实现IDispose接口,然后用到class的地方使用using。下面的msdn页面有使用和实现IDispose接口的例子和解释:IDisposableInterface

由于是从VB6(古董啊)移植过来的程序,原先就进结构体,不想改动太大。@宝_爸,能否有个妥善的解决方法?
解决方案七:
引用4楼iyomumx的回复:

你的结构不涉及非托管资源,销毁也无从谈起

'//声明一个字符数组,大小为11<MarshalAs(UnmanagedType.ByValArray,SizeConst:=11)>_Dimname()AsChar这个是一个非托管数组。
解决方案八:
引用6楼loakia5的回复:

Quote: 引用4楼iyomumx的回复:
你的结构不涉及非托管资源,销毁也无从谈起

'//声明一个字符数组,大小为11<MarshalAs(UnmanagedType.ByValArray,SizeConst:=11)>_Dimname()AsChar这个是一个非托管数组。

这是托管数组,纯的。只有在封送给非托管代码的时候它才会被复制到一个临时的内存空间中成为结构的一部分。
解决方案九:
引用6楼loakia5的回复:

Quote: 引用4楼iyomumx的回复:
你的结构不涉及非托管资源,销毁也无从谈起

'//声明一个字符数组,大小为11<MarshalAs(UnmanagedType.ByValArray,SizeConst:=11)>_Dimname()AsChar这个是一个非托管数组。

这个不是非托管,只有传给unmanagedcode是才转换成非托管数组。这个GC会管的。

时间: 2024-09-08 08:18:55

各位国庆加班的大大:如何销毁结构体里的非托管成员?的相关文章

c++-怎么在一个结构体里调用本身结构体数组

问题描述 怎么在一个结构体里调用本身结构体数组 typedef struct XML_DATA{ struct XML_DATA DATA[10]; char MENU[10][256]; ezxml_t xml; char *txt; char *strAttr; char *file; };XML_DATA m_data[10]; 这样使用为什么会报错,应该怎么修改?谢谢大家帮忙看看咯. 解决方案 定义变量要使用:struct XML_DATA m_data[10];要不就要改结构体的定义,

c c++-结构体里数组输出越界

问题描述 结构体里数组输出越界 typedef struct _base { int vec[4]; int size; void init() { size = 4; for(int i=0; i<size; i++) vec[i] = i+1; } void show() { for(int i=0; i<=size; i++) std::cout<<"vec["<<i<< "] is t"<<vec[

c++-C++结构体里构造函数地址怎么获得?

问题描述 C++结构体里构造函数地址怎么获得? struct A { union { char szBuffer[9]; struct { char ch; float fl; int i; }Value; }Data; A () { Data.Value.ch=1; Data.Value.fl=3.14; Data.Value.i=2; } }; A a1; 想打印出a1里A ()函数的地址 怎么实现??请高手指导一下 解决方案 C++标准明确规定,不能获取构造函数和析构函数的地址 解决方案二

结构体中的柔性数组成员(数组长度为0成员)!

其实很早在看LINUX下就看到这个东西,后来在MFC内存池里同样也看到了类似的东西,还依照MFC写过一个类似的小内存池,(MFC用的是return this + 1)后来在李先静的<系统程序员成长计划>里看到了类似的定义,于是心里想着总结一下,结果发现网上已经有牛人总结的很好了,于是乎就转了过来,谢谢你们的分享,这是我前进的动力!同时,需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在.但最新的C/C++不知道是

C#关于给结构体中的枚举类型成员,通过键盘键入值的问题

问题描述 初学,请高手指教!代码如下namespaceConsoleApplication1{enumgender{男,女}publicstructpeople{publicstringname;publicgendersex;publicintage;}classProgram{staticvoidMain(string[]args){peopleperson;Console.WriteLine("请输入名字:");person.name=Console.ReadLine();Con

浅析结构体函数指针与内核设备驱动

最近在公司没什么事做,突然有来写写日志和博客,这种突发的灵感来自于我在学习内核驱动代码的时候发现了结构体的一种古老的初始化方法,多亏了尚观广州校区的叶老师在群里用心的给我文字讲解,让我明白了原来结构体初始化也可以用:冒号这样的方法.          其实在C语言中,冒号:的用法有很多,比如三目运算符   表达式?表达式1:表达式2 : 它的意思就是如果表达式成立,那么执行表达式1,否则执行表达式2 .还有一种就是广泛用于结构体的位段中,例如: Struct node { Int id : 2

c语言的结构体

什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同. 定义结构体使用struct修饰符,例如: struct test

C/C++中的结构体

什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同. 定义结构体使用struct修饰符,例如: struct test

struct-c# 在一个实现了隐式转换的结构体进行强制类型转换时报错

问题描述 c# 在一个实现了隐式转换的结构体进行强制类型转换时报错 50C 如题,我有一个结构体,类似这样: public struct AInt{ private int _a; public int ToInt() { reurn _a; } public static implicit operator int(AInt value) { return value.ToInt(); } public static implicit operator AInt(int value) { _a