2011-04-07 67 views
0

以下C语句在C++中无效。C和C++之间的细微差别

int *a = malloc(sizeof(*a)); 

为什么?你如何解决它?

答案是:

Ç执行用于 无效*的隐式转换,而C++没有。使用 显式强制转换来解决此问题。

我的问题是:明确施放给谁和在哪里? 谢谢。

+2

::P

更重要的是,只要使用newdelete。答案是明确地将malloc的返回值转换为int *。 – dcousens 2011-04-07 01:21:00

回答

5

在C++中,你不得不说

int *a = (int*)malloc(sizeof(*a)); 

因为铸造void*int*没有隐含由编译器完成。为什么在C使用malloC++这个简单的任务,反正...

int *a = new int(); 
+3

如果您必须投射,请使用C++强制转换。 – 2011-04-07 01:22:37

+1

@Dirk Eddelbuettel:在这种情况下,这个建议是错误的 - 使用强制转换的唯一原因是如果你使用'malloc'而不是'new'。这样做的唯一借口就是如果你需要保持你的代码与C兼容,C++会明显中断它。如果你打算使它特定于C++,那么完全消除这个演员阵容。 – 2011-04-07 01:40:32

+0

@Jerry:“* only * excuse”有点夸大了; -P。明显的例子:'realloc'的性能影响可以证明C风格库的使用是正确的(尽管分析而不是直觉应该指导这一点)。非常赞同互操作性是主要的,尽管它不仅仅是“与C兼容”,而且任何用任何语言编写的代码(无论出于何种原因)都会继续使用'malloc' /'free'。 – 2011-04-07 03:51:13