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