C++ 是否可以从某个对象的中间部分取消分配内存;“拆分”;信息技术

C++ 是否可以从某个对象的中间部分取消分配内存;“拆分”;信息技术,c++,memory,split,memory-management,partial-specialization,C++,Memory,Split,Memory Management,Partial Specialization,例如,我有一个200个整数的数组。我要做的是把它转换成两个80个整数的数组,去掉中间的40个整数。当然,我们的目标是使用现有的内存块,而不需要分配两个长度为80个整数的新数组,也不需要从第一个数组复制,我想要的是将初始数组从80减少到120,并将剩下的作为两个单独的数组 移动语义使用一种类似的低级方法来避免不必要的右值复制,所以我的问题是,是否有一种低级方法来实现类似的效果,但将已经存在的数据分配给多个对象 例如,将指针分配给剪切位置和新元素开始位置的原始内存地址,迫使它们充当使用相同数据的数组

例如,我有一个200个整数的数组。我要做的是把它转换成两个80个整数的数组,去掉中间的40个整数。当然,我们的目标是使用现有的内存块,而不需要分配两个长度为80个整数的新数组,也不需要从第一个数组复制,我想要的是将初始数组从80减少到120,并将剩下的作为两个单独的数组

移动语义使用一种类似的低级方法来避免不必要的右值复制,所以我的问题是,是否有一种低级方法来实现类似的效果,但将已经存在的数据分配给多个对象

例如,将指针分配给剪切位置和新元素开始位置的原始内存地址,迫使它们充当使用相同数据的数组,这些数据已由初始数组分配和填充

自然地,我也可以删除初始数组并获取它的地址,并使用它来将其内存区域分配给一个新的元素,但是<强>可以告诉C++在哪个地址上分配一个新的对象< /强>?还有,是否有办法确保初始数组的数据在删除和将相同内存区域重新分配到新对象之间不会损坏


《我读过C++》的任何一本书都没有这种方法,但我觉得有可能会有一些低级的诡计来达到预期的效果。

<是的,这是可能的。但是,无法保证在删除和重新分配之间不会更改内存位置的内容。无论如何,placement new只允许您在内存中构建您已经拥有的对象。因此,您必须分配一个内存池,然后在该内存池中进行自己的内存管理。

是的,这可以使用。但是,无法保证在删除和重新分配之间不会更改内存位置的内容。无论如何,placement new只允许您在内存中构建您已经拥有的对象。因此,您必须分配一个内存池,然后在该内存池中进行自己的内存管理。

您可以使用,但通常情况下,除非您确实受到限制,否则使用这种低级别的内存不是一个好主意

在以下情况下使用它是一个好主意:

  • 您实现了一个内存池
  • 您需要写入精确的内存位置,因为平台需要(例如,某些嵌入式设备上的内存映射I/O)
使用它的缺点:

  • 您需要确保分配的内存足够大以容纳对象
  • 当不再需要对象时,需要显式调用析构函数
有没有办法保证初始数组的数据不会在删除和将同一内存区域重新分配到新对象之间被破坏

不,这取决于操作系统。如果存在特定于平台的API,它可能是可行的。

您可以使用它,但通常情况下,除非您确实受到限制,否则使用这种低级API不是一个好主意

在以下情况下使用它是一个好主意:

  • 您实现了一个内存池
  • 您需要写入精确的内存位置,因为平台需要(例如,某些嵌入式设备上的内存映射I/O)
使用它的缺点:

  • 您需要确保分配的内存足够大以容纳对象
  • 当不再需要对象时,需要显式调用析构函数
有没有办法保证初始数组的数据不会在删除和将同一内存区域重新分配到新对象之间被破坏


不,这取决于操作系统。如果存在特定于平台的API,它可能是可能的。

您唯一能做的就是调用realloc()来调整(并可能移动)分配给realloc()的malloc()块。如果块是使用new[]分配的,即使这样也不可能。您需要重写(重新发明)内存管理函数malloc()、free()和realloc()

您唯一能做的就是调用realloc()来调整(并可能移动)分配给realloc()的malloc()的块的大小。如果块是使用new[]分配的,即使这样也不可能。您需要重写(重新发明)内存管理函数malloc()、free()和realloc()

我要做的就是将指针传递到相关切片:

void i_need_80(int arr[80]);  // same as "int*"

std::array<int, 200> the_array;

i_need_80(the_array);
i_need_80(the_array + 120);
void i_need_80(int arr[80]);//与“int*”相同
std::array\u数组;
i_需要_80(_阵列);
i_需要_80(_阵列+120);
代替
std::array
还可以使用动态
std::vector v
,在这种情况下,可以使用
v.data()
v.data()+120


不要使用
new

我只需将指针传递到相关的片:

void i_need_80(int arr[80]);  // same as "int*"

std::array<int, 200> the_array;

i_need_80(the_array);
i_need_80(the_array + 120);
void i_need_80(int arr[80]);//与“int*”相同
std::array\u数组;
i_需要_80(_阵列);
i_需要_80(_阵列+120);
代替
std::array
还可以使用动态
std::vector v
,在这种情况下,可以使用
v.data()
v.data()+120


不要使用您可能正在寻找的
new

?对于整数(和其他基本类型),不需要构造任何东西,也没有任何值得“移动”的东西。还有,你的意思是“200”?是的,对不起,一个打字错误,100应该是你可能要找的200?对于整数(和其他基本类型),没有必要构造任何东西,也没有任何值得“移动”的东西。还有,你的意思是“200”?是的,对不起,一个输入错误,100应该是200替换新的[]操作符不会解决任何问题,除非你写一个全新的内存管理