gpt4 book ai didi

C++ - 运行时检查失败 #2 - 变量 'sourceCount' 周围的堆栈已损坏

转载 作者:行者123 更新时间:2023-11-30 04:05:20 26 4
gpt4 key购买 nike

我发现了类似的 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++ - 运行时检查失败 #2 - 变量 'sourceCount' 周围的堆栈已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23341352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com