我错误地用C ++写道:
Tree *tree = (Tree *)malloc(sizeof (TreeNode));
Tree
和TreeNode
是两种不同的自定义数据结构。但它没有任何问题,为什么?可能是未来的问题?
答案 0 :(得分:1)
基本上你总是可以reinterpret_cast<>
从void *
到任何指针类型,并且编译器不会检查它,还要注意真正的问题是你使用了错误的{{1} } size
的参数,可能是坏的,取决于它是小还是大。但是在这种情况下,malloc()
初始化为错误的类型并没有问题,尽管在c ++中你很有可能导致未定义的行为,原因将在下面简单解释。 / p>
一般来说,有经验的c程序员会这样做
tree
但这是无效的c ++ ,在c ++中你需要
Tree *tree = malloc(sizeof *tree);
总是会分配正确的大小。但请注意,这要求类型出现在表达式的两侧,这在c中是不必要的。
现在真正的c ++方法是,
Tree *tree = static_cast<Tree *>(malloc(sizeof *tree));
这会,
Tree *tree = new Tree;
,会出错。)Tree *tree = new TreeNode;
。与Tree
一样,您需要手动malloc()
此内存,但需要使用free()
,就像这样
delete
简而言之,在c ++中几乎不需要delete tree;
因为没有它就可以做大多数事情。它仍然存在,因为它有时是有用的,但特别是对于库编写者,应用程序编写者永远不会使用它。