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

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

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

3 回答 3

1

我不明白这段代码的意图。我的猜测是为指向的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。任务完成。

于 2013-06-13T04:10:36.583 回答
1
_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 chars(即字节),而是说你想要 40 group*。因此,如果NOMGRPS是 10,并且您在 32 位系统上,使用 4 字节指针,则分配 40 * 4 或 160 字节。这几乎肯定不是您想要的,但由于它过度分配内存,它可能会正常工作。你做出这种改变的直觉是正确的。每当您使用现代 C++ 进行转换时,您都应该认为它是可疑的。但你还远远不够。

你真正想要的是:

_Groups = new group*[NOMGRPS];

new知道 a 的大小,group*因此将为NOMGRPS它们分配足够的空间。这比使用的原始版本更正确new char

于 2013-06-13T03:16:56.753 回答
0

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

于 2013-06-13T03:11:08.090 回答