在C中,"没有声明类型的已分配对象"的C++等价物是什么?

xiv*_*r77 15 c c++ memory

我正在用C++为我的VM编写一个内存管理器.好吧,更确切地说,VM指令将被编译成带有嵌入式内存管理器的C++.我在处理C方面感觉更舒服,但现在我确实需要异常处理的原生支持,这几乎是我使用C++的唯一原因.

C和C++都有严格的别名规则,两个不兼容类型的对象不应重叠,在C中对于联合有一个小的例外.但是,以限定的存储器分配功能,如行为malloc,calloc,alloca等等,C标准具有以下段落.

6.5-6访问其存储值的对象的有效类型是对象的声明类型(如果有).已分配的对象没有声明的类型.如果通过具有非字符类型的左值的值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该值的后续访问的有效类型储值.如果使用memcpy或将值复制到没有声明类型的对象中memmove,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是有效类型复制值的对象,如果有的话.对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型.

这有效地使用原始分配的内存为任何类型在C中定义良好的行为.我试图在C++标准文档中找到类似的段落,但找不到一个.我认为C++在这方面有不同的方法.什么是C语言中"没有声明类型的已分配对象"的C++等价物,C++标准如何定义它?

cma*_*ter 0

我认为,C++在这方面的做法可以概括为:“malloc()是邪恶的。用new代替的。不存在没有声明类型的对象”。当然,C++ 实现需要定义 global operator new(),它基本上是 C++ 版本malloc()(并且可以由用户提供)。这个运算符的存在证明了C++中存在类似没有声明类型的对象之类的东西,但标准不会承认这一点。

如果我是你,我会采取务实的态度。全局operator new()malloc()C++ 中都可用,因此任何实现都必须能够合理地使用它们的返回值。尤其malloc()是在 C 和 C++ 中表现相同。因此,只需像在 C 中处理这些无类型对象一样处理它们,就可以了。