C++与动态内存分配混淆

C++ confusing with Dynamic memory allocation

本文关键字:分配 内存 动态 C++      更新时间:2023-10-16
_Groups = (group **) new char[sizeof (group **) * NOMGRPS];

以上是我阅读的实际代码。我只是想知道如果我这样做有什么差异

_Groups = new group*[sizeof (group **) * NOMGRPS];
_Groups = (group **) new char[sizeof (group **) * NOMGRPS]; 

这为NOMGRPS组指针创造了足够的空间,并将其强制转换为指向group**的指针,大概用作分配给其他地方的 group 类型的对象的指针数组。 这是(或更严格地说,是(一个常见的习语,因为char几乎总是一个字节,所以这说"分配sizeof (group **) * NOMGRPS字节(足够的字节用于NOMGRPS组指针(并将其强制转换为指向组指针的指针。 因此,如果NOMGRPS是 10,并且您使用的是 32 位系统,具有 4 个字节指针,则分配 40 个字节。

_Groups = new group*[sizeof (group **) * NOMGRPS];

这里不是说你想要 40 char s(即字节(,而是说你想要 40 group* . 因此,如果NOMGRPS为 10,并且您使用的是具有 4 个字节指针的 32 位系统,则分配 40 * 4 或 160 个字节。 这几乎肯定不是您想要的,但由于它过度分配内存,因此它可能会正常工作。 你做出这种改变的直觉是正确的。 任何时候你用现代C++铸造,你都应该认为它是可疑的。 但你走得还不够远。

你真正想要的是这个:

_Groups = new group*[NOMGRPS];

new知道group*的大小,因此会为其中NOMGRPS分配足够的资源。 这比使用new char的原始版本更正确。

我不明白这段代码的意图。我的猜测是为NOMGRPS指向group的指针分配内存,即您需要(指针大小NOMGRPS*字节(内存。


如果是这样,那么这个

_Groups = (group **) new char[sizeof (group **) * NOMGRPS];

你想做的事。虽然以错误的方式。它为(指针大小NOMGRPS *大小(字符分配内存。char的大小是 1 个字节,这就是为什么这条线可以做你想要的。但:

1(您需要为指针分配内存,而不是字符。

2(您需要为group *指针分配内存,而不是group **。所以sizeof (group **)错了。


_Groups = new group*[sizeof (group **) * NOMGRPS];

这将为指针分配内存(NOMGRPS * 指针大小(,这不是您想要的。


有效方式:

_Groups = new group *[ NOMGRPS ];

它为NOMGRPS指向group的指针分配内存。任务完成。

(Point **) new char[10]分配

内存十char秒,然后将指针转换为指向Point*的指针。如果sizeof(char) != sizeof(Point*),这可能会崩溃,因为分配的数组大小错误。所以这是完全错误的。