使用“new”运算符是否可能分配任意内存块? 在C语言中,我可以这样做:“void * p = malloc(7);” - 如果内存对齐设置为1字节,则会分配7个字节。如何在C++中使用new运算符实现同样的效果?
使用“new”运算符是否可能分配任意内存块? 在C语言中,我可以这样做:“void * p = malloc(7);” - 如果内存对齐设置为1字节,则会分配7个字节。如何在C++中使用new运算符实现同样的效果?
在C++中可以使用operator new
分配任意大小的内存块,但不能使用用于构造对象的new
运算符。
void* pBlock = ::operator new(7);
这样的内存块可以使用operator delete
进行释放。
::operator delete(pBlock);
请注意,operator new
将为任何类型的对象分配适当对齐的内存,因此实现可能不会精确地分配七个字节而不多,但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>
。不仅可以获得任意块的字节(保证连续),还可以在RAII封装器中获得它们。当然,除了resize()
之外,没有必要使用std::vector
的任何方法,但没有任何惩罚:
std::vector<char> buffer(7);
void* p = &buffer[0];
std::string
,但是std::string
意味着“此对象包含可打印的字符”,而std::vector<char>
则表示“此对象包含任意字节组”。是的,你可以这样做。
但是根据你所做的事情,可能会有更好的技术。
能否更新问题并告诉我们你想要实现什么。提供更多上下文,可以提供更好的解决方案。
例如:
如果你正在动态分配一个缓冲区来从套接字中读取(因为大小在编译时未知),那么另一种选择是使用向量并动态调整其大小。然后,通过获取第一个元素的地址,可以得到指向缓冲区内部的指针。
新建一个 char[7] 的数组。
传统上,char 是一个字节,尽管你可能会发现一些库将其 typedef 为 BYTE 类型。
您可以执行char* pBuffer = new char[7];
,由于char
大小为1字节,因此您可以将其用作字节缓冲区。另外,在释放内存时,请记得使用delete[]
(带有[])。