在C++中,不允许在没有显式强制转换的情况下为任何整数指针分配void*指针.这需要使用static_cast.
但这是怎么回事:
int* iptr = new int;
Run Code Online (Sandbox Code Playgroud)
我知道新的运算符定义如下:
void* operator new(size_t);
Run Code Online (Sandbox Code Playgroud)
C++如何处理这个问题?我知道这是一个基本问题,但很重要.我也知道低级代码必须使用void.但这项任务如何合法?iptr是指向int的指针,new返回指向void的指针,它应该触发"错误:从'void*'到'int*'[-fpermissive]"无效转换的消息.
n. *_* m. 21
您已经混淆了新运算符和运算符新函数.没问题,每个人都这样.它们几乎相同,只是它们不同.
该函数void* operator new(size_t)从其生长的任何树中获取一块原始的无类型内存,并将其返回给程序.
void* raw_memory = ::operator new(42);
Run Code Online (Sandbox Code Playgroud)
这是一个普通的函数,有点奇怪的名字.
在新的运营商不是一个功能,而不是一个函数调用.它是一个单独的语言结构.它需要原始内存(通常是void* operator new(size_t)函数返回的内存)并通过调用构造函数将其转换为对象.然后它返回一个正确类型的指针指向新创建的对象.
Fish* f = new Fish;
Run Code Online (Sandbox Code Playgroud)
更新自然地,还有删除操作符(与新操作符相反)和void operator delete(void*)函数(与void* operator new(size_t)函数相反).
还有new []运算符,delete []运算符,void* operator new[](size_t)函数和void operator delete[](void*)函数; 它们处理对象数组(而不是单个对象).
还有一些所谓的"放置新"表单不会调用任何operator new新鲜内存的函数,而是需要一个指向原始内存的显式指针.它们没有相应的内置"删除"表单.如果你这么倾向,你可以自己动手,但我在清醒时拒绝谈论任何这些.