我发现了类似的SO问题,但与我的here不同。
我的函数如下所示:
BOOL ShallowCopy(const LPVOID psource, LPVOID pdest) {
LPBYTE ps = reinterpret_cast<LPBYTE>(psource);
LPBYTE pd = reinterpret_cast<LPBYTE>(pdest);
ULONG sourceCount = 0, destCount = 0;
std::copy(ps, ps + 8, checked_array_iterator<LPBYTE>(((LPBYTE)((LPVOID)&sourceCount)), 8)); // Get psource byte count
std::copy(pd, pd + 8, checked_array_iterator<LPBYTE>(((LPBYTE)((LPVOID)&destCount)), 8)); // Get pdest byte count
if (sourceCount != destCount) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
std::copy(ps, ps + sourceCount, checked_array_iterator<unsigned char *>(pd, destCount));
return TRUE;
}
当我这样调用函数时:
if (!ShallowCopy(pcsbi, &csbi)) {
cerr << _T("FATAL: Shallow copy failed.") << endl;
}
系统抛出运行时异常,并说“运行时检查失败2-变量'sourceCount'周围的堆栈已损坏”。
但是,如果将sourceCount和destCount转换为变量,则不会收到此错误:
BOOL ShallowCopy(const LPVOID psource, LPVOID pdest) {
LPBYTE ps = reinterpret_cast<LPBYTE>(psource);
LPBYTE pd = reinterpret_cast<LPBYTE>(pdest);
LPBYTE pbCount = new BYTE[8];
ULONG sourceCount = 0, destCount = 0;
std::copy(ps, ps + 8, checked_array_iterator<LPBYTE>(pbCount, 8)); // Get psource byte count
sourceCount = *((PULONG)pbCount);
std::copy(pd, pd + 8, checked_array_iterator<LPBYTE>(pbCount, 8)); // Get pdest byte count
destCount = *((PULONG)pbCount);
delete[] pbCount;
if (sourceCount != destCount) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
std::copy(ps, ps + sourceCount, checked_array_iterator<unsigned char *>(pd, destCount));
return TRUE;
}
当我看这2个函数时,没有什么区别,只是稍后将值存储到变量中,然后转换为目标。那么,究竟是什么导致运行时错误?
最佳答案
ULONG
被定义为unsigned long
,那么它只有32位(4个字节,而不是您的代码中的8个字节)。
之所以会出现此错误,是因为在堆栈分配了变量destCount
(或sourceCount
,它们在哪里和顺序仅是实现细节)之后覆盖了内存。在第二个示例中,它起作用是因为您分配了足够的内存(pbCount
是8个字节),并且此sourceCount = *((PULONG)pbCount);
将仅复制其中的4个。
我建议使用sizeof
而不是硬编码的数据类型大小:
std::copy(ps, ps + sizeof(ULONG)...
请注意,您甚至可以简单地写:
sourceCount = *reinterpret_cast<PULONG>(ps);
destCount = *reinterpret_cast<PULONG>(pd);
关于c++ - C++-运行时检查失败#2-变量 'sourceCount'周围的堆栈已损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23341352/