数据类型(从 malloc 返回)是如何转换的?



我错误地用C++写道:

Tree *tree = (Tree *)malloc(sizeof (TreeNode));

TreeTreeNode是两种不同的自定义数据结构。但它没有任何问题,为什么?未来可能出现什么问题?

基本上,您始终可以从void *到任何指针类型进行reinterpret_cast<>,编译器不会检查这一点,还要注意,真正的问题是您使用了错误的size参数,malloc()该参数可能不好,也可能不好,这取决于它是更小还是更大。但是在这种情况下,没有与将tree初始化为错误类型相关的问题,尽管在 c++ 中,由于下面将解释的原因,您有很大的风险导致未定义的行为。

一般来说,有经验的c程序员会做

Tree *tree = malloc(sizeof *tree);

但这是无效的 C++,在 C++ 中你需要

Tree *tree = static_cast<Tree *>(malloc(sizeof *tree));

这将始终分配正确的大小。但请注意,这要求类型无论如何都出现在表达式的两侧,这在 c 中不是必需的。

现在真正的 c++ 方法是,

Tree *tree = new Tree;

这将,

  1. 分配正确的内存量。
  2. 类型安全(如果您这样做Tree *tree = new TreeNode;,那将是一个错误)。
  3. 调用任何构造函数以Tree

malloc()一样,您需要手动free()此内存,但请使用delete,如下所示

delete tree;

简而言之,malloc()在 c++ 中几乎从不需要,因为您可以在没有它的情况下做大多数事情。它仍然退出,因为它有时很有用,但特别是对于库编写者,应用程序编写者永远不要使用它。

相关内容

  • 没有找到相关文章

最新更新