⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_62424.htm

📁 vc
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dsadsdas 回复日期:2003-11-28 17:37:58
<br>内容:&lt;BLOCKQUOTE&gt;引用“第10楼”所言<BR>&lt;Q&gt;谢谢!我会尝试一下你的方法,但是为什么呢?&nbsp;&nbsp;&nbsp;&nbsp;另外:&nbsp;&nbsp;我发现将vc/project/setting/c++/codeGeneration/useRuntimeLibrary统统设置为MultithreadDll&nbsp;&nbsp;该问题并得到了解决,你知道是什么原因吗?&lt;/Q&gt;&lt;/BLOCKQUOTE&gt;<BR>这有两种可能<BR>1.当你都使用dll模式的时候,CRT都在dll里面,或者说,你的分配。释放内存代码都在那个VC***.dll里面,而不在你的exe或者你的dll里面,这样这个问题就解决了。<BR>2.当你使用dll模式的时候,VC把std::string的实现放在dll里面了,这样的话,string的内存分配就在那个dll里面了,也可以解决问题。<BR>不过按照我看来,原因应该是1。因为我查看过vc的头文件,他的string不export的,更何况他也不会把string的实现放到CRT里面去,不符合逻辑。<BR>顺便说一句,从你遇到的问题可以看出COM这类二进制兼容的架构的重要性;))))
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:陈启华 回复日期:2003-11-28 17:52:05
<br>内容:我也比较赞同com构架,可惜的是公司上层不允许使用,我很无奈.<BR><BR>另外,你能说明一下,为什么分配和释放内存一定要在一个模块中实现,动态库和main不是在同一个地址空间中吗,按道理应该可以随便申请和释放呀,目前我就剩这个问题不明白,您多<BR>指点指点,谢谢了.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dsadsdas 回复日期:2003-11-28 17:59:07
<br>内容:不用那么客气,事实上你也在动脑筋,我们只是讨论而已。<BR><BR>举个简单的例子,如果exe中我分配了一个2M的堆,并且在里面分配小片内存。<BR>并且dll里面也有一个2M的堆。<BR><BR>那么,我在exe里面分配20字节的内存,这个内存是在exe的堆里面的。这个时候,你把他放到dll里面去释放,dll的代码根本不能释放这段内存,因为不认识:pppp<BR>而且,以上说的还是比较好的情况,差的情况是,exe和dll使用不同的分配算法/代码,那才麻烦呢。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:陈启华 回复日期:2003-11-29 11:40:25
<br>内容:谢谢! 给我推荐几本关于这方面的书怎样?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dsadsdas 回复日期:2003-11-29 11:43:24
<br>内容:&lt;BLOCKQUOTE&gt;引用“第14楼”所言<BR>&lt;Q&gt;谢谢! 给我推荐几本关于这方面的书怎样?&lt;/Q&gt;&lt;/BLOCKQUOTE&gt;<BR>哪方面?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:陈启华 回复日期:2003-11-29 11:49:06
<br>内容:关于动态库和exe内存管理方面,关于VC runtimelib方面
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dsadsdas 回复日期:2003-11-29 12:00:26
<br>内容:这没书的,其实就像我说得你都懂,只不过你没从这个地方分析而已。<BR><BR>解决这个问题有两个途径:<BR>1.调试能力。<BR>也就是说,这个问题你通过调试肯定是可以发现的,只不过比较麻烦<BR>2.分析能力。<BR>就是说,遇到什么问题往什么方向想。我基本上没调试,就在那里和你空口说白话,呵呵。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:陈启华 回复日期:2003-11-29 12:24:46
<br>内容:最后按照我的理解,动态库和Exe分配的内存分别都有自己的权限,寻址肯定是对了,只不过是Exe没有释放动态库分配内存的权限而已,但如果释放函数是export的,就有这个权限了,<BR>是这样吗?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:陈启华 回复日期:2003-11-29 13:08:03
<br>内容:我找到一句话,与你共享:<BR>注意必须注意的是,单个地址空间是由一个可执行模块和若干个D L L模块组成的。<BR>这些模块中,有些可以链接到静态版本的C / C + +运行期库,有些可以链接到一个D L L<BR>版本的C / C + +运行期库,而有些模块(如果不是用C / C + +编写的话)则根本不需要<BR>C / C + +运行期库。许多开发人员经常会犯一个常见的错误,因为他们忘记了若干个<BR>C / C + +运行期库可以存在于单个地址空间中。请看下面的代码:<BR>void ExeFunc(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;PVOID pv = DllFunc();<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Access the storage pointed to by pv...<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Assumes that pv is in Exe's C/C++ run-time heap<BR>&nbsp;&nbsp;&nbsp;&nbsp;free(pv);<BR>}<BR>PVOID DllFunc(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Allocate block from Dll's C/C++ run time heap<BR>&nbsp;&nbsp;&nbsp;&nbsp;return (malloc(100));<BR>}<BR>那么你是怎么看待这个问题的呢?上面这个代码能够正确运行吗? D L L函数分配<BR>的内存块是由E X E的函数释放的吗?答案是可能的。上面显示的代码并没有为你提供<BR>足够的信息。如果E X E和D L L都链接到D L L的C / C + +运行期库,那么上面的代码将能够<BR>很好地运行。但是,如果两个模块中的一个或者两个都链接到静态C / C + +运行期库,那<BR>么对free函数的调用就会失败。我经常看到编程人员编写这样的代码,结果都失败了。<BR><BR>void ExeFunc(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;PVOID pv = DllFunc();<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Access the storage pointed to by pv...<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Make no assumptions about C/C++ run-time heap<BR>&nbsp;&nbsp;&nbsp;&nbsp;DllFree(pv);<BR>}<BR>PVOID DllFunc(void)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Allocate block from Dll's C/C++ run time heap<BR>&nbsp;&nbsp;&nbsp;&nbsp;return (malloc(100));<BR>}<BR>BOOL DllFree(PVOID pv)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// Free block from Dll's C/C++ runtime heap<BR>&nbsp;&nbsp;&nbsp;&nbsp;return (free(pv));<BR>}<BR>这个代码是正确的,它始终都能正确地运行。当你编写一个模块时,不要忘记其<BR>他模块中的函数也许没有使用C / C + +来编写,因此可能无法使用m a l l o c和f r e e函数进行<BR>内存的分配。应该注意不要在代码中使用这些假设条件。另外,在内部调用m a l l o c和<BR>f r e e函数时,这个原则对于C + +的n e w和d e l e t e操作符也是适用的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dsadsdas 回复日期:2003-11-29 13:54:29
<br>内容:&lt;BLOCKQUOTE&gt;引用“第18楼”所言<BR>&lt;Q&gt;最后按照我的理解,动态库和Exe分配的内存分别都有自己的权限,寻址肯定是对了,只不过是Exe没有释放动态库分配内存的权限而已,但如果释放函数是export的,就有这个权限了,&nbsp;&nbsp;是这样吗?&lt;/Q&gt;&lt;/BLOCKQUOTE&gt;<BR>不是。<BR>这不是因为权限的问题,本质上说,两个module的分配和释放代码你可以认为根本就是不相关的。这就和你在一个process里面分配的内存在另一个process里面不能free一样(当然,具体情况上可能有差别)。<BR>后面你的那篇文章说得很清楚了,就是因为这个原因。<BR>其实某种意义上说,看看COM/CORBA这样的架构可以获得很多这方面的经验。C++是一个包容万象的体系,所以别的架构的经验几乎都可以使用。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -