【问题标题】:C++ confusing with Dynamic memory allocationC++ 与动态内存分配混淆
【发布时间】:2013-06-09 07:58:47
【问题描述】:
_Groups = (group **) new char[sizeof (group **) * NOMGRPS];

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

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

【问题讨论】:

  • 我不明白为什么投反对票。这个问题是具体而有效的,但有些人认为批评比开导更容易。
  • 第一个看起来很可疑,第二个几乎可以保证你做错了什么。除此之外,如果不知道您要达到的目标,就无法回答您的问题。
  • 和第一个一样,我从来没有说过任何一行都是无效的。它只是您在现实生活中通常看不到的代码。如果您正在寻找语法解释,第一行会动态分配足够的内存来包含 10 个指向 Point 类型的指针。第二个分配足够的内存以包含 10 个chars,然后将结果转换为指向Point 的指针。老实说,我想不出为什么有人会这样做。
  • @Praetorian:我刚刚发布了我阅读的实际代码。你能告诉我我阅读的实际代码与我刚刚在帖子中编辑的代码是否有任何差异。

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


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

你真正想要的是这个:

_Groups = new group*[NOMGRPS];

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

【讨论】:

  • 嗨,Steven 感谢您的解释。由于我对 c++ 还很陌生,所以我还不太了解这些。至于我,我只知道动态分配的基本概念。我喜欢在图形视图中理解我知道你不会为我做的事情。所以如果我参考这个youtube.com/watch?v=i5gUlnrUqqQ,这个图形解释可以给我一个更好的观点吗?
  • 顺便说一句:_Groups = new group*[NOMGRPS]; wqual 等于 _Groups = (group **) new char[sizeof (group **) * NOMGRPS]; ?
  • 一般来说是的。它可能编译成同样的东西。
【解决方案2】:

我不明白这段代码的意图。我的猜测是为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];

这会为 (NOMGRPS * size of pointer) 指针分配内存,这不是您想要的。


有效方式:

_Groups = new group *[ NOMGRPS ];

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 实际上我正在阅读的实际代码应该是这个 _Groups = (group **) new char[sizeof (group **) * NOMGRPS];但我将数组大小简化为 10。
    • 啊,那很不一样。将其“简化”为 10 的大小会将其从合理变为怪异。
    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2015-06-27
    • 2021-02-28
    相关资源
    最近更新 更多