2009-07-02 95 views
8

是否可以使用“new”运算符分配任意内存块?在C中,我可以像“void * p = malloc(7);” - 如果内存对齐设置为1个字节,则会分配7个字节。如何使用新操作符在C++中进行相同操作?C++中的内存分配

回答

43

任意存储器块可以在C++ operator new被分配;而不是用于构建对象的new运算符。

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

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

::operator delete(pBlock); 

注意operator new将分配的内存为任何类型的对象适当地对齐,因此实现可能不分配整整7个字节,并没有更多的,但相同的是(通常)的malloc如此。 C客户端malloc通常也需要对齐的内存。

8

不能分配void指针与C++的操作new:你必须分配一个明确的类型,如charuint8_t

char *p = new char[7]; 
uint8_t *q = new uint8_t[7]; 
... 
delete [] p; 
delete [] q; 
2

我想你可能会寻找Placement New

+1

我只会补充一点,如果您打算使用安置新的技巧,您必须小心。只有在真正需要时才使用它! – 2009-07-02 15:52:19

+5

放置新内容如何与分配内存有关? – avakar 2009-07-02 16:03:33

+0

@Miky D:我同意,这就是为什么链接页面全部大写字母都是“DANGER”字样的原因。 :-) – 2009-07-02 16:07:39

2

new char [7];

传统,char是一个字节,虽然你可能会发现有些库的typedef一个BYTE类型。

2

你可以做char* pBuffer = new char[7];,而且由于的sizeof(char)的1个字节你可以使用它作为一个字节的缓冲区。另外,请记住在释放内存时使用delete[](带[])。

11

其他人已经回答了这个问题所写,但我想建议使用malloc /免费提供这样的分配坚持。

新增和删除用于分配对象。他们分配所需的内存并调用构造函数/析构函数。如果你知道你只需要一个任意的内存块,使用malloc和free是完全合理的。

3

是的,你可以。
但是,根据你在做什么,可能会有更好的技术。

可以更新的问题,并告诉我们你想达到的目标。在更多情况下,可以提供更好的解决方案。

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

3

个人而言,我会用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>暗示”此对象包含任意字节组“。