一个关于DLL中分配内存同时在DLL中释放出错的有关问题
一个关于DLL中分配内存同时在DLL中释放出错的问题
问题大致是这样的,在我的DLL中,有两个函数:
Export void A()
{
int i* = new int[BUFFER];
//省略部分代码赋值和计算的代码
delete[] i;
}
Export void B()
{
int i* = new int[BUFFER];
//省略部分代码赋值和计算的代码
delete[] i;
}
两个函数中唯一的区别只有省略的那部分执行的数学计算不同,在主程序中,调用函数A()是没有_CrtIsValidHeapPointer这个错误的,但是函数B()却会提示_CrtIsValidHeapPointer相关的错误,我在网上搜了下,大致的意思都是说DLL和EXE彼此的堆管理器是相互独立的,可是如果是这样,不是应该函数A()也会报错么?为何只有B报错,而A不会?求教所有的可能,谢谢了
------解决方案--------------------
你这都是在dll中分配和释放的,所以不存在你说的堆管理器问题,
既然A和B中间执行代码不一样,那么估计是B中的其它代码处理指针时有越界等问题。
------解决方案--------------------
单步跟踪下B函数。
也可以用二分排除法,找原因。
------解决方案--------------------
自定义类型里面有没有指针的,拷贝的时候需要特别注意。
还有字符串拷贝函数有没有用的?
问题大致是这样的,在我的DLL中,有两个函数:
Export void A()
{
int i* = new int[BUFFER];
//省略部分代码赋值和计算的代码
delete[] i;
}
Export void B()
{
int i* = new int[BUFFER];
//省略部分代码赋值和计算的代码
delete[] i;
}
两个函数中唯一的区别只有省略的那部分执行的数学计算不同,在主程序中,调用函数A()是没有_CrtIsValidHeapPointer这个错误的,但是函数B()却会提示_CrtIsValidHeapPointer相关的错误,我在网上搜了下,大致的意思都是说DLL和EXE彼此的堆管理器是相互独立的,可是如果是这样,不是应该函数A()也会报错么?为何只有B报错,而A不会?求教所有的可能,谢谢了
------解决方案--------------------
你这都是在dll中分配和释放的,所以不存在你说的堆管理器问题,
既然A和B中间执行代码不一样,那么估计是B中的其它代码处理指针时有越界等问题。
------解决方案--------------------
单步跟踪下B函数。
也可以用二分排除法,找原因。
------解决方案--------------------
自定义类型里面有没有指针的,拷贝的时候需要特别注意。
还有字符串拷贝函数有没有用的?