sha*_*oth 8 c++ memory-management
我的C++程序需要一块未初始化的内存和一个void*指向该块的指针,以便我可以将它提供给第三方库.我想将块生命周期的控制权传递给库,所以我不想使用std::vector.当库完成块时,它将调用我必须提供的回调,并将解除分配块.在CI中将使用malloc()和以后free().
在C++中我可以调用::operator new或::operator new[]与::operator delete或operator 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[]反之亦然 - 未定义的行为.除了我选择哪一对以及为什么?
使用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*.