8

是否可以使用“new”运算符分配任意内存块?在 CI 中可以像“void * p = malloc(7);”那样做 - 如果内存对齐设置为 1 个字节,这将分配 7 个字节。如何在 C++ 中使用 new 操作符做同样的事情?

4

8 回答 8

45

operator new在 C++中可以分配任意内存块;不是new用于构造对象的运算符。

void* pBlock = ::operator new(7);

随后可以使用 释放此类块operator delete

::operator delete(pBlock);

请注意,operator new将为任何类型的对象分配适当对齐的内存,因此实​​现可能不会完全分配七个字节并且不会更多,但(通常)也是如此malloc。C 客户端malloc通常也需要对齐的内存。

于 2009-07-02T15:51:21.967 回答
11

其他人已经按照书面形式回答了这个问题,但我建议坚持使用 malloc/free 进行此类分配。

new 和 delete 用于分配对象。它们分配所需的内存并调用构造函数/析构函数。如果您知道只需要任意一块内存,那么使用 malloc 和 free 是完全合理的。

于 2009-07-02T15:50:03.857 回答
8

您不能void使用 C++ 的运算符分配指针new:您必须分配显式类型,例如charor uint8_t

char *p = new char[7];
uint8_t *q = new uint8_t[7];
...
delete [] p;
delete [] q;
于 2009-07-02T15:46:42.813 回答
3

是的你可以。
但取决于你在做什么,可能会有更好的技术。

您能否更新问题并告诉我们您要达到的目标。有了更多的上下文,可以提供更好的解决方案。

一个例子:
如果你动态分配一个缓冲区来从一个套接字读取(因为在编译时大小是未知的)。另一种方法是使用向量并动态调整其大小。然后,您可以通过获取第一个元素的地址来获取指向缓​​冲区内部的指针。

于 2009-07-02T16:16:05.470 回答
3

我个人会使用std::vector<char>. 您不仅可以获得任意字节块(保证是连续的),而且还可以将它们放入 RAII 包装器中。当然,没有必要使用任何std::vector' 方法(除了,也许,resize()),但没有任何惩罚:

std::vector<char> buffer(7);
void* p = &buffer[0];

您可以使用 a std::string,但std::string暗示“此对象包含在打印出来时有意义的字符”,其中 astd::vector<char>暗示“此对象包含任意字节组”。

于 2009-07-02T18:00:15.620 回答
2

我想您可能正在寻找Placement New

于 2009-07-02T15:46:55.667 回答
2

新字符[7];

传统上,char 是一个字节,尽管您可能会发现一些库将类型定义为 BYTE 类型。

于 2009-07-02T15:46:57.243 回答
2

您可以这样做char* pBuffer = new char[7];,并且由于 sizeof(char) 是 1 个字节,您可以将其用作字节缓冲区。delete[]另外,释放内存时记得使用(with [])。

于 2009-07-02T15:49:26.367 回答