【问题标题】:Why is the new operator allowed to return *void to every pointer-type?为什么允许 new 运算符将 *void 返回到每个指针类型?
【发布时间】:2012-01-22 16:11:46
【问题描述】:

在 C++ 中,不允许在没有显式转换的情况下将 void* 指针分配给任何整数指针。这需要使用 static_cast。

但这是怎么回事:

int* iptr = new int;

我知道 new 运算符的定义如下:

void* operator new(size_t);

C++ 如何处理这个问题? 我知道这是一个基本问题,但很重要。我也知道低级代码必须使用void。但是这个分配怎么可能是合法的呢? iptr 是一个指向 int 的指针,new 返回一个指向 void 的指针,这应该会触发类似“错误:从‘void*’到‘int*’的无效转换 [-fpermissive]”这样的消息。

【问题讨论】:

标签: c++


【解决方案1】:

您混淆了 new 运算符和 operator new 函数。没问题,每个人都会。它们几乎相同,只是它们不同。

函数void* operator new(size_t) 从它所生长的任何树上抓取一块原始的、无类型的内存,并将其返回给程序。

void* raw_memory = ::operator new(42);

这是一个名字有点奇怪的普通函数。

new 运算符不是函数,也不是函数调用。这是一个单独的语言结构。它占用原始内存(通常由void* operator new(size_t) 函数返回)并通过调用构造函数将其转换为对象。然后它返回一个正确类型的指针,指向新创建的对象。

Fish* f = new Fish;

UPDATE 自然也有 delete 运算符(与 new 运算符相反)和void operator delete(void*) 函数(相反void* operator new(size_t) 函数)。

还有new[]操作符、delete[]操作符、void* operator new[](size_t)函数、void operator delete[](void*)函数;它们处理对象数组(而不是单个对象)。

还有所谓的“放置新”形式,它不调用任何operator new 函数来获取新内存,而是需要一个指向原始内存的显式指针。它们没有相应的内置“删除”表单。如果你愿意的话,你可以自己动手,但我在清醒的时候拒绝谈论这些。

【讨论】:

  • +1 表示“它们几乎相同,只是它们不同。”
  • @Seth:不,delete void_ptr; 是未定义的行为。你会使用::operator delete(void_ptr_from_operator_new);
  • 自然有delete操作符(与new操作符相反)和void operator delete(void*)函数(与@987654333相反) @ 功能)。还有 new[] 运算符、delete[] 运算符、void* operator new[](size_t) 函数和void operator delete[](void*) 函数。还有没有对应“删除”的“放置新”表单。
  • 非常感谢!现在对我来说似乎很清楚。因为即使使用 gdb 进行调试也不会“向我展示”这一点。
  • "placement new" 确实调用了operator new(),但它调用了具有更多参数的不同重载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2011-09-04
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多