我错误地用C++写道:
Tree *tree = (Tree *)malloc(sizeof (TreeNode));
Tree
和TreeNode
是两种不同的自定义数据结构。但它没有任何问题,为什么?未来可能出现什么问题?
基本上,您始终可以从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;
这将,
- 分配正确的内存量。
- 类型安全(如果您这样做
Tree *tree = new TreeNode;
,那将是一个错误)。 - 调用任何构造函数以
Tree
。
与malloc()
一样,您需要手动free()
此内存,但请使用delete
,如下所示
delete tree;
简而言之,malloc()
在 c++ 中几乎从不需要,因为您可以在没有它的情况下做大多数事情。它仍然退出,因为它有时很有用,但特别是对于库编写者,应用程序编写者永远不要使用它。