【发布时间】:2013-08-21 21:07:25
【问题描述】:
操作系统:Windows x86、MFC、CRT、VS2010
从 Visual Studio 2005 (SP1) 升级到 VS2010-SP1 后,我遇到了运行时 CRT 堆损坏异常。
当我的应用程序使用调试编译时,CRT 只会抱怨损坏。而且我认为 VS2010 在评估内存访问时过于严格。
可疑的违规代码执行以下操作:
typedef struct _T_TEST
{
DWORD flag;
TCHAR str[1];
} T_TEST;
// Then the structure is used in this way
void test(TCHAR * p_str) {
DWORD size = sizeof(DWORD) + (_tcslen(p_str) + 1) * sizeof(TCHAR);
T_TEST * foo = (T_TEST *) calloc(size, 1);
foo->flag = 0;
_tcscpy_s(foo->str, size - sizeof(DWORD), p_str);
// Do IPC with the struct
// When finished, free it
free(foo);
}
此代码有时会在 free(foo) 上失败,而在将分配的缓冲区转换为 (T_TEST *) 时有时会失败。
以这种方式扩展结构大小是否有效? VS2010 中是否有一些不同的东西将其视为堆损坏?
任何帮助将不胜感激!
【问题讨论】:
-
Mark Ransom 指出了您的错误。我只想评论一下,如果 Visual Studio 说你的堆损坏了,它就是在告诉你真相并试图帮助你。请不要与之争论!努力寻找错误,而不是试图证明边缘代码的合理性。
-
您的问题也被标记为 C++,但您使用的是 C 技术(calloc 和 free 而不是 new 和 delete)现代 C++ 比 C 安全得多,如果您正确使用它,您会少很多可能会遇到此类错误。
-
注明。如何删除标签? (没关系)
标签: c visual-studio-2010 exception mfc struct