Windows 10中char *的内存分配问题

时间:2016-12-02 11:22:23

标签: c++ visual-studio-2010 dll windows-10

我在visual studio 2010中创建了一个c ++ dll,其中有两个char *类型的变量(都没有初始化)。我已经使用不同的方法为这些变量分配了值。请参阅代码片段

char* a;
char* b;
a = strtok(input,"^");
GetClassName(handle,b,255);
...
//definition of GetClassName
WINUSERAPI
int
WINAPI
GetClassName(
__in HWND hWnd,
__out_ecount_part(nMaxCount, return) LPSTR lpClassName,
__in int nMaxCount
);

以上代码在 WINDOWS 10 中失败。它适用于Windows 7,8。

当我初始化char * b像char* b =new char;时,它开始在Windows 10上工作,虽然我只初始化了b和char * a仍未初始化。 当我将char * b初始化为NULL时,它不起作用。

Windows 10中是否存在内存分配问题?另外我想知道像这样初始化char *有什么缺点。

1 个答案:

答案 0 :(得分:1)

GetClassName需要"数组"写入的字符作为第二个参数。数组的长度作为第三个参数传递。

如果您将未初始化的指针作为第二个参数传递,那么您将有未定义的行为,因为指针将指向一个不确定的位置。即GetClassName函数将写入内存中某些看似随机的位置。

调用它的最简单方法是声明一个数组并将其大小作为参数传递:

char b[256];
GetClassName(handle, b, sizeof b);

至于为什么它似乎有时而不是其他时间,它只是因为未定义的行为。其中一种可能性是看似正在工作。

当您执行b = new char时,您只会分配单个字符。它只能保存一个大小为零的以null结尾的字节字符串,因为它可以包含的是终结符。将1以外的任何大小传递给GetClassName将导致函数写出超出已分配内存的范围,并且您将再次具有未定义的行为

此外,a 已初始化。它由先前分配的strtok调用结果初始化。这并不重要,因为在a的调用中未使用GetClassName。其初始化状态与GetClassName呼叫无关。