matlab调用c++生成的DLL

最近项目测试出现一个令人头疼的问题,前面半个月基本都在修复程序内存泄露,利用一些内存泄露工具进行检测,检测的时候发现有些内存泄露并不完全能够根据行来定位,最好的办法,通过程序调试,在调式的过程执行到某一步的时候,这时会弹出内存泄露,这个时候,通过几次程序运行回合,就能够定位到我们内存泄露之处,遇到这些内存泄露其实并不可靠,可怕的是我们自己,有些人一遇到这种问题头就大了,而到网上去搜,或者到群里问,其实这些都没必要,每个人遇到的问题都不一样了,别人也不会浪费时间来帮你解决这个问题,最好的办法是沉下心来解决这个问题,有个时候是我们程序多次进行析构导致的,为何会遇到这种问题呢,由于有个时候我们开辟内存的地址存入了不同指针数组,它们基于项目需要,而需要这样使用,这个时候不小心就会出现这个问题,还有就是我们派生类析构了,再到父类又进行了一次析构,当父类定义为visual析构,析构派生类的时候是一级一级往父类析构,这样可能出现对某些元素进行重复析构,我们往往在析构的时候,首先需要判断这个指针是否析构了,析构完的时候记得赋空,以防我们再次对析构完的对象进行再次使用,尤其是有些函数要重复进行调用,而调用的函数里有许许多多成员,这个时候我们都要判断这个成员是否已经分配了内存,分配了内存我们要释放,就析构完赋空,然后再开辟内存,不知道为何,在VS里有个时候不进行释放,程序运行完没有任何提示,而当我们生成动态链接库DLL供外部matlab调用,matlab调用执行到某处时提示如下:


面对这种提示:Debug Assertion Failed!头就大了,因为是matlab里提示的,而不是在vs里提示,这样根本没法调试,难道重新检查VS程序,程序有40多个类,难道一个一个找吗?头就大了,这个坑越挖越深,网上有人说可以将VS设置成Release模式,回忽略断言Assertion这个错误,于是我将VS工程设置成Release模式,生成DLL,matlab调用确实运行成功!但既然问题来了,得解决,一个老程序员给我的建议你可以加入MessageBox(0,“ ”,“  ”,MB_OK),这样我用这种死办法放入程序进行调试,最后解决了问题,由于我程序在多次调用某些函数,而这些函数对某些类的成员进行内存多次分配,在分配前我并没有释放,这是需要注意的,matlab调用DLL时尤其要注意的VS不能有任何内存泄露,虽然VS编译能够通过,但是matlab并不能。

在我们matlab调用DLL失败的可能还有就是你的DLL缺乏某些DLL,我们一般使用DLL分析工具:depends22_x64,内存泄露检测工具:Visual Leak Detector

对于这个问题最好的解决办法是这样,不需要再VS的c++里添加这个messagebox函数,我们可以点击重试,直到崩溃,弹出选择c++调试器,这时,我们再打开VS里的调试->工具->调用堆栈。 就可以定位到错误出在哪里里。没必要用上面的死办法,还有上述都在Debug模式下编译的,我们最终要在matlab下调用最好是Releaase模式下,Debug模式下可能没有问题,但在Release模式下可能就有问题。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值