在MFC中添加C文件,
一般的的流程是添加完成后,取消预编译选项,然后在C文件中按照C语言的方式编写就可以了;
在C++中调用C函数,extern “C” 包含函数就可以了,或者包含C文件相关的头文件就可以了;
但是今天发现了一个问题:
在C文件中通过malloc()函数创建内存空间, 在C++中,通过new创建内存空间;
然后将C的内存空间memcpy到C++的内存空间;
在debug的时候没有问题,但是在release的时候出现了问题,如下:
//c文件:
unsignd char * CreateMem()
{
......;
unsignd char * pbuf = (unsignd char *)malloc(1000);
return pbuf;
}
//C++文件
void GetMem()
{
unsignd char * pGetBuf = CreateMem();
unsignd char * pNewBuf = new unsignd char[1000];
memcpy(pNewBuf, pGetBuf, 1000);
}
//C++程序的中调用;
void testFunction()
{
GetMem(); //release模式下,执行到这里直接崩溃;debug下运行正常;
}
大概调用方式流程是上面的,因为没有找到具体原因,所以不知道问题在哪里,只是大概写了一下;
我觉得应该都可以用,但是release出错;
百度之后,有人说是 new的时候要指定空间的类型,我猜想,或许malloc也要指定类型,但是都指定了,还是错误;
没有找到更好的办法,为了解决这个问题,我只好经C文件修改为CPP文件,然后重新编译,修改相关类型转,就可以正常运行了;
目前还不清楚什么原因,又懂得,可以分析一下,写到评论里;
建议: 这里建议不要将 C 文件和 CPP 文件 程序混合应用, 如果非要用到几个简单的C文件,建议将c文件修改为cpp文件,然后将 其中的malloc修改为new, free修改为delete;
如果c文件比较多,建议封装为dll,然后cpp再用;
关于 new 和 malloc
现在一般用C的人少了,C++中,建议用new,不要用 malloc,之前的问题,可以是用的自定义动态链表,非常频繁的 malloc 和free,几个小时后,在指针内存的地方程序崩溃了,这类问题也没法调试,因为程序没有错误,只是可能malloc错误了;
也不建议 malloc 和 new 混合应用;
关于局部静态指针:
比如 static unsignd char * pbuf = new unsignd char [10000];
但是在几个小时后,居然 程序崩溃了,通过dump文件定位,居然显示pbuf为0,修改为全局变量,程序运行一天时间,没有出现过崩溃;