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

时间:2013-06-13 03:00:59

标签: c++ oop dynamic-memory-allocation

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

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

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

3 个答案:

答案 0 :(得分:1)

_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,并且您使用的是32位系统,并且有4个字节的指针,则会分配40 * 4或160个字节。这几乎肯定不是你想要的,但是因为它会分配内存,所以它可能会正常工作。你做这种改变的直觉是正确的。任何时候你使用现代C ++,你应该认为它是可疑的。但是你还没有走得太远。

你真正想要的是:

_Groups = new group*[NOMGRPS];

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

答案 1 :(得分:1)

我不明白这段代码的意图。我的猜测是为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的{​​{1}}指针分配内存。完成任务。

答案 2 :(得分:0)

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