用new []分配n个字节并用任何类型填充它?

Cri*_*iss 9 c++ memory

我想动态分配已知大小的内存(只是内存,不打扰类型),并用完全相同数量的数据填充它,但任何类型(我只确定它将是原始类型).以后我会释放它.

好吗?:

auto dest = new int8_t[n];
std::memcpy(dest, src, n);
delete[] dest;
Run Code Online (Sandbox Code Playgroud)

src是ptr到一个大小的数组n(字节).我选择int8_t这是因为它是分配一定数量内存的最清晰方式.事实上,上面的代码并不是exaclt它将是什么.delete[]将在实际指向的类型的指针上调用.所以例如,如果src是一个浮点数组(忘记上面代码的最后一行):

float * ptr = dest;
delete[] ptr;
Run Code Online (Sandbox Code Playgroud)

再说一遍.会没事吗?

ala*_*ain 6

没关系,但是只有在使用char数组或unsigned char数组时,由于这些类型的特殊对齐保证:

5.3.4新建
11当new-expression调用分配函数并且尚未扩展分配时,new-expression将请求的空间量作为std :: size_t类型的第一个参数传递给分配函数.该参数不得小于正在创建的对象的大小; 仅当对象是数组时,它可能大于正在创建的对象的大小.对于char和unsigned char的数组, new-expression的结果与分配函数返回的地址之间的差异应该是任何对象类型的最严格的基本对齐要求(3.11)的整数倍,其大小不大于正在创建的数组的大小.[注意:因为假定分配函数返回指向存储的指针,该存储适当地对齐具有基本对齐的任何类型的对象,所以这种对数组分配开销的约束允许分配字符数组的常用习惯用法,稍后将放置其他类型的对象. - 结束说明]

我强调.

另一个要求是你只使用原始类型或POD,因为你没有调用构造函数,而是(普通的)析构函数(通过delete).


pav*_*nik 2

也许使用 std 向量会更好?无需手动释放内存..

std::vector<uint8_t> vdest(n);
uint8_t * dest = vdest.data();

std::memcpy(dest, src, n);

float * ptr = reinterpret_cast<float*>(dest);
...
Run Code Online (Sandbox Code Playgroud)

编辑:正如 @alain 指出的:“不能保证 uint8_t 数组与新类型正确对齐”

因此,如果您想使用这种方法,那么看看这个问题是个好主意: Is it good Practice to use std::vector as a simple buffer?

  • 无法保证“uint8_t”数组与新类型正确对齐。 (2认同)