注册 登录
编程论坛 C++教室

为毛有内存泄漏啊,我K,这不科学啊

天使梦魔 发布于 2014-02-20 21:16, 712 次点击
只有本站会员才能查看附件,请 登录
程序运行无问题,一退出就崩溃。查过了,没有内存释放不干净问题。


运行程序在rar包里面,使用opengl进行一个测试。
我自己写的是DLL文件,作用是对文件进行打包和加密。
已经经过一系列测试,所以对DLL内部的安全性不用质疑。
opengl部分是抄鼎鼎大名的nehe教程里的第6课。释放的部分没有改动,按道理应该没有内存泄漏。
而我的部件也不会出现泄漏的问题。
它的纹理读取使用的是辅助库,而我改了一下,直接读取我内存的文件。
自己添加的函数是void LoadTexture(void)。其它都是课程里的代码
extern "C" __declspec(dllimport) int ReadRZ(char *filename,char *readname,std::string &outtext);
//我DLL的接口
string mybmp;
//全局二进制文件变量,不要讨论我是怎么把二进制数据存放到string里的

这是程序代码:
只有本站会员才能查看附件,请 登录
6 回复
#2
天使梦魔2014-02-20 21:19
对于自写函数那几个循环没有经过严格处理,但我能保证它是正确的,因为它的正确与否依赖图片的属性,这点我能保证,图片是bmp 256*256的大小
#3
天使梦魔2014-02-20 23:08
问题找到一点,从string的部分释放有问题,但我又想不出是什么原因,因为我不使用内存纹理,只是读取数据,string在没有任何使用的情况下清零还是会出事。
就是说string在DLL内部走过一遍exe就无法释放了,但我输出接口用的是引用string的地址啊,真正储存string的还是exe自身,唉搞不懂唉~~~
#4
rjsp2014-02-21 11:04
extern "C" __declspec(dllimport) int ReadRZ(char *filename,char *readname,std::string &outtext);
--- 别用 std::string
第一:你dll中的std::string可能和exe中的std::string不是同一个类型,编译器在link时检查不出来
第二:std::string可能使用了自己的分配器,即使用不这样,也没法保证跨模块内存分配/内存释放能够匹配
#5
fl89622014-02-21 11:16
#6
天使梦魔2014-02-21 15:05
行了,我C,此时此刻我的心情就像要射出来一样爽。

我在DLL内部进行了一次释放
void freedll(string &s)
{
  s.~string();
}

EXE里面在EXE定义出来的string生命期结束前呼叫这个函数,就不会有泄漏了,我CCCCCCCCCCC
不可思议啊~~~~~~~~~~~~~
#7
天使梦魔2014-02-21 16:34
蒙对了的有95分
打酱油的有5分
1