【问题标题】:memory allocation issue of char* in windows 10Windows 10 中 char* 的内存分配问题
【发布时间】:2016-12-02 11:22:22
【问题描述】:

我在 Visual Studio 2010 中创建了一个 c++ dll,其中有两个 char* 类型的变量(均未初始化)。我使用不同的方法为这些变量赋值。请参阅 sn-p

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 =new char; 一样初始化 char* b 时,它开始在 Windows 10 上工作,尽管我只初始化了 b 并且 char* a 仍未初始化。 当我将 char* b 初始化为 NULL 时,它不起作用。

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

【问题讨论】:

  • “上述代码失败” “它不起作用”你看到了什么究竟?你的minimal reproducible example 在哪里?对您的问题提供严谨和科学的描述;如果你没有,那么你还没有结束你自己的调试阶段。另外,是什么阻止您阅读the documentation for the functions you used
  • @LightnessRacesinOrbit 抱歉,我是新来的。从现在开始,我将在提问时遵循最小、完整和可验证的示例。我已经浏览了文档,但我想知道它在 windows7、8 上是如何工作的,但在 windows 10 上却没有
  • 不是;它似乎只是。

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


【解决方案1】:

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

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

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

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

至于为什么它有时会起作用而其他时候不起作用,这只是因为未定义的行为。其中一种可能性是似乎在起作用。

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


另外,a 初始化。它由strtok 调用结果的先前分配初始化。这并不重要,因为在对GetClassName 的调用中没有使用a。其状态是否已初始化与GetClassName 调用无关。

【讨论】:

  • 在 C++ 术语中,不,a 未初始化,尽管它确实已由strtok 的结果分配给称呼。我相信口语 C 术语,第一次赋值算作“初始化”。
  • @RajeshRaghunathan 未定义的行为。这就是所有需要说的。有时它似乎工作,有时是产生nasal demons
猜你喜欢
  • 2019-05-07
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2011-03-18
相关资源
最近更新 更多