如何以及何时从 malloc 投递回报
How and when to cast the return from malloc?
我不确定在使用malloc
时处理类型转换的正确方法。我来自目标C,其中以下内容是完全合法的:
ALuint * sources;
sources=malloc(sizeof(ALuint)*32);
但是,在C++中,编译器说"从不兼容的类型void *分配给ALuint *"。
我知道从malloc
返回的内存没有被强制转换为我的特定类型,并且我知道C++对类型很严格。
现在,我可以这样做:
sources=(ALuint*)malloc(sizeof(ALuint)*32);
但是我读到比我自己聪明得多的程序员说永远不要以这种方式投射。为什么不呢?如果没有,何时或如何进行这项工作的最佳时间或方法?
- 避免在C++中使用
malloc
。 - 如果必须
#1
,则必须强制转换返回类型malloc
,以便代码编译。 #2
唯一的例外是目标指针是void
指针。- 不投射
malloc
的回归(有争议地)被认为是 C 语言的良好做法。
因此,在C++中,演员阵容是必要的。不过,要使用的石膏类型也很重要。绝对不应该是C型演员阵容。以上链接仅表明需要演员。
现在,我可以这样做:
sources=(ALuint*)malloc(sizeof(ALuint)*32);
但是我读到比我自己聪明得多的程序员说永远不要以这种方式投射。为什么不呢?
因为在C++ c 样式转换由标准定义,以按以下顺序映射到C++转换。第一个成功的将用于:
- const_cast
- static_cast
- static_cast,然后const_cast
- reinterpret_cast
- reinterpret_cast,然后const_cast
如您所见,c 样式的强制转换实际上可能会导致reinterpret_cast
这是潜在的危险,因为它可以在不兼容的指针类型之间进行转换。因此,如果您必须使用malloc
请使用:
sources=static_cast<ALuint*>malloc(sizeof(ALuint)*32);
相关文章:
- 如果没有malloc,链表实现将失败
- malloc() 可能出现内存泄漏
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 在C++中创建队列 - 什么是 malloc 错误?
- 如何在 malloc 内存中初始化非 POD 数据
- 使用 malloc() 时出现意外大小
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 将 malloc 替换为数组
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何将新更改为 malloc?
- 将 malloc 转换为新的正确方法
- Malloc void return char 数组有时不起作用(Terry Davis 对 C++);
- 如何通过 malloc 为队列数组分配内存?
- 正在调试 malloc():新内存损坏
- 我怎样才能代替使用新的使用malloc翻译
- C++程序错误:malloc():内存损坏
- 如何以及何时从 malloc 投递回报