使用哪个 - "operator new"或"operator new []" - 在C++中分配一块原始内存?

sha*_*oth 8 c++ memory-management

我的C++程序需要一块未初始化的内存和一个void*指向该块的指针,以便我可以将它提供给第三方库.我想将块生命周期的控制权传递给库,所以我不想使用std::vector.当库完成块时,它将调用我必须提供的回调,并将解除分配块.在CI中将使用malloc()和以后free().

在C++中我可以调用::operator new::operator new[]::operator deleteoperator delete[]分别更高版本:

void* newBlock = ::operator new( sizeOfBlock );
// then, later
::operator delete( newBlock );
Run Code Online (Sandbox Code Playgroud)

貌似都::operator new::operator new[]具有完全相同的签名和完全一样的行为.同样的::operator delete::operator delete[].我不应该做的唯一事情是配对operator new,operator delete[]反之亦然 - 未定义的行为.除了我选择哪一对以及为什么?

Mic*_*yan 7

使用new与单个对象和new[]与对象的数组.所以,例如:

int* x = new int; // Allocates single int
int* y = new int[5]; // Allocates an array of integers

*x = 10; // Assignment to single value
y[0] = 8; // Assignment to element of the array

如果你所做的只是分配内存缓冲区,那么分配一个数组,char如:

int bufferlen = /* choose a buffer size somehow */
char* buffer = new char[bufferlen];
// now can refer to buffer[0] ... buffer[bufferlen-1]

但是,在C++中,您应该真正使用std::vector任意数组,并且您应该使用std::string要解释或用作字符串的字符数组.

没有理由为这些调用调用::operator new::operator new[]显式而不是使用普通语法.对于POD和原始类型(例如char),不会进行初始化.如果你需要一个void*缓冲区,那么只需使用static_cast转换char*void*.

  • OP不是在讨论`new int`和`new int [5]`,而是专门用给定名称调用函数,例如`void*p = operator new(50);`vs`void*p = operator新[](50);`. (2认同)
  • 您的更新有点错误.`new int`和`new int()`之间存在差异(后一个对象保证初始化为零),对于任何POD类型都是如此.一个特殊情况也适用于new []:`new int [5]()`. (2认同)