是否可以使用“new”运算符分配任意内存块?在C中,我可以像“void * p = malloc(7);” - 如果内存对齐设置为1个字节,则会分配7个字节。如何使用新操作符在C++中进行相同操作?C++中的内存分配
回答
任意存储器块可以在C++ operator new
被分配;而不是用于构建对象的new
运算符。
void* pBlock = ::operator new(7);
此类块随后可以用operator delete
释放。
::operator delete(pBlock);
注意operator new
将分配的内存为任何类型的对象适当地对齐,因此实现可能不分配整整7个字节,并没有更多的,但相同的是(通常)的malloc
如此。 C客户端malloc
通常也需要对齐的内存。
不能分配void
指针与C++的操作new
:你必须分配一个明确的类型,如char
或uint8_t
:
char *p = new char[7];
uint8_t *q = new uint8_t[7];
...
delete [] p;
delete [] q;
我想你可能会寻找Placement New。
new char [7];
传统,char是一个字节,虽然你可能会发现有些库的typedef一个BYTE类型。
你可以做char* pBuffer = new char[7];
,而且由于的sizeof(char)的1个字节你可以使用它作为一个字节的缓冲区。另外,请记住在释放内存时使用delete[]
(带[])。
其他人已经回答了这个问题所写,但我想建议使用malloc /免费提供这样的分配坚持。
新增和删除用于分配对象。他们分配所需的内存并调用构造函数/析构函数。如果你知道你只需要一个任意的内存块,使用malloc和free是完全合理的。
是的,你可以。
但是,根据你在做什么,可能会有更好的技术。
可以更新的问题,并告诉我们你想达到的目标。在更多情况下,可以提供更好的解决方案。
示例:
如果您是动态分配缓冲区以从套接字读取(因为在编译时未知大小)。另一种方法是使用矢量并动态调整大小。然后,您可以通过获取第一个元素的地址来获取指向缓冲区内部的指针。
个人而言,我会用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>
暗示”此对象包含任意字节组“。
- 1. C中的内存分配
- 2. C++中的内存分配
- 3. C内存分配
- 4. 内存分配,C++
- 5. C++分配内存
- 6. 在C/C++中的内存分配
- 7. C中的免费C分配内存#
- 8. 在C/C++中分配内存失败
- 9. 内存泄漏在C /内存分配++
- 10. 将内存分配给C++中的char *
- 11. C中矩阵的内存分配
- 12. C++中的指针内存分配
- 13. C中的内存管理(分配)
- 14. 目标C中的内存分配
- 15. c中线程的内存分配
- 16. C++中的结构内存分配
- 17. C++内存分配问题
- 18. 目标C:分配内存
- 19. C++:内存分配器
- 20. 内存分配在C
- 21. C函数分配内存
- 22. 内存分配在C#
- 23. C++可变内存分配
- 24. C++分配内存问题
- 25. 内存分配在obj c
- 26. 高级C内存分配
- 27. track C++内存分配
- 28. C:提前分配内存还是每次分配内存?
- 29. 在c#中分配“非托管”内存
- 30. 在C#中分配一块内存?
我只会补充一点,如果您打算使用安置新的技巧,您必须小心。只有在真正需要时才使用它! – 2009-07-02 15:52:19
放置新内容如何与分配内存有关? – avakar 2009-07-02 16:03:33
@Miky D:我同意,这就是为什么链接页面全部大写字母都是“DANGER”字样的原因。 :-) – 2009-07-02 16:07:39