一个关于DLL中分配内存同时在DLL中释放出错的问题

时间:2022-05-15 02:26:30
问题大致是这样的,在我的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不会?求教所有的可能,谢谢了

8 个解决方案

#1


你这都是在dll中分配和释放的,所以不存在你说的堆管理器问题,
既然A和B中间执行代码不一样,那么估计是B中的其它代码处理指针时有越界等问题。

#2


单步跟踪下B函数。
也可以用二分排除法,找原因。

#3


引用 1 楼 zhuobattle 的回复:
你这都是在dll中分配和释放的,所以不存在你说的堆管理器问题,
既然A和B中间执行代码不一样,那么估计是B中的其它代码处理指针时有越界等问题。

不会这么巧吧= =这两天越界好几次都没察觉到。。每次都是检查了又检查的说= =不管怎么样, 我再检查几遍= =!

#4


引用 2 楼 zhuobattle 的回复:
单步跟踪下B函数。
也可以用二分排除法,找原因。

调试了一两个小时了,对数组大小和循环的次数都做了好几次检查,虽然凡事无绝对,有可能是某个地方越界了我没察觉,不过,还有别的可能吗?

#5


引用 2 楼 zhuobattle 的回复:
单步跟踪下B函数。
也可以用二分排除法,找原因。

另外,我早前测试的时候发现。。如果把delete去掉。。。程序就不会抱错了,而且也没有内存泄漏的现象,中间省略的代码中有一个自定义的类型,接受的是这里贴出来的数组作为参数的,拷贝数组内的数据用的是memcpy,A和B都是相同的工作流程,请问这之间有什么可能需要注意的细节和容易出问题的地方吗?

#6


引用 5 楼 chn3698 的回复:
Quote: 引用 2 楼 zhuobattle 的回复:

单步跟踪下B函数。
也可以用二分排除法,找原因。

另外,我早前测试的时候发现。。如果把delete去掉。。。程序就不会抱错了,而且也没有内存泄漏的现象,中间省略的代码中有一个自定义的类型,接受的是这里贴出来的数组作为参数的,拷贝数组内的数据用的是memcpy,A和B都是相同的工作流程,请问这之间有什么可能需要注意的细节和容易出问题的地方吗?

自定义类型里面有没有指针的,拷贝的时候需要特别注意。
还有字符串拷贝函数有没有用的?

#7


引用 6 楼 zhuobattle 的回复:
Quote: 引用 5 楼 chn3698 的回复:

Quote: 引用 2 楼 zhuobattle 的回复:

单步跟踪下B函数。
也可以用二分排除法,找原因。

另外,我早前测试的时候发现。。如果把delete去掉。。。程序就不会抱错了,而且也没有内存泄漏的现象,中间省略的代码中有一个自定义的类型,接受的是这里贴出来的数组作为参数的,拷贝数组内的数据用的是memcpy,A和B都是相同的工作流程,请问这之间有什么可能需要注意的细节和容易出问题的地方吗?

自定义类型里面有没有指针的,拷贝的时候需要特别注意。
还有字符串拷贝函数有没有用的?

有指针,不过拷贝构造函数里全部都用memcpy处理了,而且如你所言,我确实让数组越界了。。这次越界的有点不明显,本来应该计算4次的,但是用了原始的数据,结果计算了6次,没察觉到,直到我刚才将数组的遍历范围扩大了一倍,才发现在数组的范围外还有计算出来的数据= =。。。真希望以后不要再这么马虎了= =多谢

#8


可能存在B函数写操作越界。 导致检查buffer开头的0xFDFDFDFD, Buffer结束的0xFDFDFDFD不存在(DEBUG),报错。 

#1


你这都是在dll中分配和释放的,所以不存在你说的堆管理器问题,
既然A和B中间执行代码不一样,那么估计是B中的其它代码处理指针时有越界等问题。

#2


单步跟踪下B函数。
也可以用二分排除法,找原因。

#3


引用 1 楼 zhuobattle 的回复:
你这都是在dll中分配和释放的,所以不存在你说的堆管理器问题,
既然A和B中间执行代码不一样,那么估计是B中的其它代码处理指针时有越界等问题。

不会这么巧吧= =这两天越界好几次都没察觉到。。每次都是检查了又检查的说= =不管怎么样, 我再检查几遍= =!

#4


引用 2 楼 zhuobattle 的回复:
单步跟踪下B函数。
也可以用二分排除法,找原因。

调试了一两个小时了,对数组大小和循环的次数都做了好几次检查,虽然凡事无绝对,有可能是某个地方越界了我没察觉,不过,还有别的可能吗?

#5


引用 2 楼 zhuobattle 的回复:
单步跟踪下B函数。
也可以用二分排除法,找原因。

另外,我早前测试的时候发现。。如果把delete去掉。。。程序就不会抱错了,而且也没有内存泄漏的现象,中间省略的代码中有一个自定义的类型,接受的是这里贴出来的数组作为参数的,拷贝数组内的数据用的是memcpy,A和B都是相同的工作流程,请问这之间有什么可能需要注意的细节和容易出问题的地方吗?

#6


引用 5 楼 chn3698 的回复:
Quote: 引用 2 楼 zhuobattle 的回复:

单步跟踪下B函数。
也可以用二分排除法,找原因。

另外,我早前测试的时候发现。。如果把delete去掉。。。程序就不会抱错了,而且也没有内存泄漏的现象,中间省略的代码中有一个自定义的类型,接受的是这里贴出来的数组作为参数的,拷贝数组内的数据用的是memcpy,A和B都是相同的工作流程,请问这之间有什么可能需要注意的细节和容易出问题的地方吗?

自定义类型里面有没有指针的,拷贝的时候需要特别注意。
还有字符串拷贝函数有没有用的?

#7


引用 6 楼 zhuobattle 的回复:
Quote: 引用 5 楼 chn3698 的回复:

Quote: 引用 2 楼 zhuobattle 的回复:

单步跟踪下B函数。
也可以用二分排除法,找原因。

另外,我早前测试的时候发现。。如果把delete去掉。。。程序就不会抱错了,而且也没有内存泄漏的现象,中间省略的代码中有一个自定义的类型,接受的是这里贴出来的数组作为参数的,拷贝数组内的数据用的是memcpy,A和B都是相同的工作流程,请问这之间有什么可能需要注意的细节和容易出问题的地方吗?

自定义类型里面有没有指针的,拷贝的时候需要特别注意。
还有字符串拷贝函数有没有用的?

有指针,不过拷贝构造函数里全部都用memcpy处理了,而且如你所言,我确实让数组越界了。。这次越界的有点不明显,本来应该计算4次的,但是用了原始的数据,结果计算了6次,没察觉到,直到我刚才将数组的遍历范围扩大了一倍,才发现在数组的范围外还有计算出来的数据= =。。。真希望以后不要再这么马虎了= =多谢

#8


可能存在B函数写操作越界。 导致检查buffer开头的0xFDFDFDFD, Buffer结束的0xFDFDFDFD不存在(DEBUG),报错。