_Groups = (group **) new char[sizeof (group **) * NOMGRPS];
以上是我阅读的实际代码。我只是想知道如果我这样做有什么区别
_Groups = new group*[sizeof (group **) * NOMGRPS];
_Groups = (group **) new char[sizeof (group **) * NOMGRPS];
以上是我阅读的实际代码。我只是想知道如果我这样做有什么区别
_Groups = new group*[sizeof (group **) * NOMGRPS];
我不明白这段代码的意图。我的猜测是为指向的NOMGRPS
指针分配内存group
,即您需要(NOMGRPS
*指针大小)字节的内存。
如果是这样,那么这个
_Groups = (group **) new char[sizeof (group **) * NOMGRPS];
做你想做的事。虽然方法不对。NOMGRPS
它为 ( * size of pointer) 字符分配内存。的大小char
是 1 个字节,这就是为什么这条线可以满足您的要求。但:
1)您需要为指针分配内存,而不是字符。
2)您需要为group *
指针分配内存,而不是group **
. 所以sizeof (group **)
是错误的。
_Groups = new group*[sizeof (group **) * NOMGRPS];
这会为 ( * size of pointer) 指针分配内存NOMGRPS
,这不是您想要的。
有效方式:
_Groups = new group *[ NOMGRPS ];
NOMGRPS
它为指向的指针分配内存group
。任务完成。
_Groups = (group **) new char[sizeof (group **) * NOMGRPS];
这为组指针创建了足够的空间NOMGRPS
并将其转换为指向 a 的指针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,并且您在 32 位系统上,使用 4 字节指针,则分配 40 * 4 或 160 字节。这几乎肯定不是您想要的,但由于它过度分配内存,它可能会正常工作。你做出这种改变的直觉是正确的。每当您使用现代 C++ 进行转换时,您都应该认为它是可疑的。但你还远远不够。
你真正想要的是:
_Groups = new group*[NOMGRPS];
new
知道 a 的大小,group*
因此将为NOMGRPS
它们分配足够的空间。这比使用的原始版本更正确new char
。
(Point **) new char[10]
为 10 秒分配内存char
,然后将指针转换为指向Point*
. 如果sizeof(char) != sizeof(Point*)
因为分配的数组大小错误,这很可能会崩溃。所以这是完全错误的。