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

时间:2017-10-01 14:07:53

标签: c++ malloc

我错误地用C ++写道:

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

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

1 个答案:

答案 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));

这会,

  1. 分配正确的内存量。
  2. 属于类型安全(如果你Tree *tree = new Tree; 会出错。)
  3. 调用Tree *tree = new TreeNode;
  4. 的所有构造函数

    Tree一样,您需要手动malloc()此内存,但需要使用free(),就像这样

    delete

    简而言之,在c ++中几乎不需要delete tree; 因为没有它就可以做大多数事情。它仍然存在,因为它有时是有用的,但特别是对于库编写者,应用程序编写者永远不会使用它。