【发布时间】:2010-11-07 16:34:53
【问题描述】:
是否可以使用“new”运算符分配任意内存块? 在 C 语言中,我可以像“void * p = malloc(7);”那样做- 如果内存对齐设置为 1 个字节,这将分配 7 个字节。如何在 C++ 中用 new 操作符做同样的事情?
【问题讨论】:
标签: c++ memory new-operator
是否可以使用“new”运算符分配任意内存块? 在 C 语言中,我可以像“void * p = malloc(7);”那样做- 如果内存对齐设置为 1 个字节,这将分配 7 个字节。如何在 C++ 中用 new 操作符做同样的事情?
【问题讨论】:
标签: c++ memory new-operator
在 C++ 中可以使用operator new 分配任意内存块;不是用于构造对象的new 运算符。
void* pBlock = ::operator new(7);
这些块随后可以通过operator delete 释放。
::operator delete(pBlock);
请注意,operator new 将为任何类型的对象分配适当对齐的内存,因此实现可能不会完全分配 7 个字节,但malloc (通常)也是如此。 malloc 的 C 客户端通常也需要对齐内存。
【讨论】:
其他人已经按照书面形式回答了这个问题,但我建议坚持使用 malloc/free 进行此类分配。
new 和 delete 用于分配对象。它们分配所需的内存并调用构造函数/析构函数。如果你知道你只需要一个任意的内存块,那么使用 malloc 和 free 是完全合理的。
【讨论】:
您不能使用 C++ 的运算符 new 分配 void 指针:您必须分配显式类型,例如 char 或 uint8_t:
char *p = new char[7];
uint8_t *q = new uint8_t[7];
...
delete [] p;
delete [] q;
【讨论】:
是的,你可以。
但取决于你在做什么,可能会有更好的技术。
您能否更新问题并告诉我们您要达到的目标。有了更多的上下文,可以提供更好的解决方案。
一个例子:
如果您正在动态分配缓冲区以从套接字读取(因为在编译时不知道大小)。另一种方法是使用向量并动态调整其大小。然后,您可以通过获取第一个元素的地址来获取指向缓冲区内部的指针。
【讨论】:
我个人会使用std::vector<char>。您不仅可以获得任意字节块 (guaranteed to be contiguous),还可以将它们放入 RAII 包装器中。当然,没有必要使用std::vector 的任何方法(可能除了resize()),但没有任何惩罚:
std::vector<char> buffer(7);
void* p = &buffer[0];
您可以使用std::string,但std::string 暗示“此对象包含在打印时有意义的字符”,而std::vector<char> 暗示“此对象包含任意字节组。”
【讨论】:
我想你可能正在寻找Placement New。
【讨论】:
新字符[7];
传统上,char 是一个字节,但您可能会发现一些库将类型定义为 BYTE 类型。
【讨论】:
您可以使用char* pBuffer = new char[7];,并且由于 sizeof(char) 是 1 字节,您可以将其用作字节缓冲区。另外,释放内存时记得使用delete[](带[])。
【讨论】: