gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:43:34 25 4
gpt4 key购买 nike

我的 C++ 程序需要一 block 未初始化的内存和一个指向该 block 的 void* 指针,以便我可以将其提供给第三方库。我想将 block 生命周期的控制权交给库,所以我不想使用 std::vector。当库完成 block 时,它将调用我必须提供的回调,这将释放 block 。在 C 语言中,我会使用 malloc() 和后来的 free()

在 C++ 中,我可以调用 ::operator new::operator new[]::operator delete operator delete[] 之后分别为:

void* newBlock = ::operator new( sizeOfBlock );
// then, later
::operator delete( newBlock );

看起来 ::operator new::operator new[] 具有完全相同的签名和完全相同的行为。 ::operator delete::operator delete[] 也是如此。我唯一不应该做的是将 operator newoperator delete[] 配对,反之亦然 - 未定义的行为。除此之外,我选择哪一对,为什么?

最佳答案

对单个对象使用 new,对对象数组使用 new[]。所以,例如:

int* x = new int; // Allocates single intint* y = new int[5]; // Allocates an array of integers*x = 10; // Assignment to single valuey[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_castchar* 转换为void*

关于c++ - 使用哪个 - "operator new"或 "operator new[]"- 在 C++ 中分配一 block 原始内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2498183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com