11

请注意,这个问题与mallocC 或C++ 中的 /smart 指针无关。mallocnew

如果我malloc在 C++ 中使用,我应该使用哪种类型的演员表?以下所有工作。

int *a = (int *)malloc(sizeof (int));
int *b = static_cast<int *>(malloc(sizeof (int)));
int *c = reinterpret_cast<int *>(malloc(sizeof (int)));

现场示例:http: //ideone.com/lzfxcm

我更喜欢在我的代码中尽可能多地使用 C++ 样式转换,并且我想采用安全的编码习惯。请牢记这一点。

谢谢你。

4

4 回答 4

12

由于malloc返回指向 的指针void,因此没有理由在指针上使用 C++ 风格的强制转换:你得到一块原始内存,后面没有结构,所以你可以通过添加强制转换告诉编译器的唯一事情是您计划将此内存用于特定类型的数据。编译器必须同意你的观点,因为它没有额外的信息来仔细检查你的决定。与 C-style cast 相比,也static_cast<T>没有reinterpret_cast<T>提供特别的优势,而且 C-style cast 更短。

从个人角度来看,我查看了很多 C++ 代码,但我从未见过与 一起使用的 C++ 样式转换malloc,只有 C 样式。

于 2013-09-25T12:31:58.707 回答
10

我更喜欢使用static_cast,因为您正在做的是将 a 转换void*为指向其他对象类型的指针,这在 C++ 中定义良好。

C 风格的转换不应该在 C++ 中使用,因为编译器不会执行任何类型检查 - 通过使用 C 风格的转换,您将失去所有类型安全。这个想法是将你的演员限制在需要的范围内,而不是更多。

reinterpret_cast有不同的目的 - 将对象的位重新解释为其他类型。void不是一个对象,所以这显然不适用于void*/ malloc

于 2013-09-25T12:33:42.940 回答
2

坚持始终使用“最少暴力”演员阵容的原则,我会推荐static_cast.

但是,更好的是包装函数,例如

template <typename T>
T* mnew(std::size_t count = 1)
{
    return static_cast<T*>(malloc(sizeof(T) * count));
}
于 2013-09-25T12:36:01.413 回答
0

malloc 返回 void* 指针,您可以使用 C 样式转换将其转换为任何所需的指针,但 C++ 引入了 4 个新的转换运算符来克服与 C 样式转换相关的一个缺点,即使用 IDE 或任何其他工具无法轻松检测到它们像 grep。

考虑你的例子

int *a = (int *)malloc(sizeof (int));
int *b = static_cast<int *>(malloc(sizeof (int)));
int *c = reinterpret_cast<int *>(malloc(sizeof (int)));

在这里,您可以轻松地搜索 static_cast 或 reinterpret_cast 的所有实例,但如果它是 c 样式转换,那么您别无选择,只能简单地查看或挖掘代码并度过不眠之夜。相信我,铸造错误非常困难,它们破坏了 C 和 C++ 风格语言提供的强类型保证。但他们是一些需要这种演员阵容的真实案例。

因此,C++ 允许 C 风格的强制转换,但它引入了 reinterpret_cast 运算符,它只执行 C 风格的强制转换操作。

http://www.stroustrup.com/bs_faq2.html#void-ptr

于 2013-09-25T12:41:48.427 回答