【问题标题】:C++: how to reallocate array using same memory space but going down in sizeC ++:如何使用相同的内存空间重新分配数组但大小减小
【发布时间】:2020-07-02 18:45:52
【问题描述】:

如果我有一个动态分配的数组char* arr = new char[100];

1:如果我想保留数组的前半部分并释放最后 50 个,我该怎么做。 所以我基本上得到了相同的指针,但我得到的好像我做了char* arr = new char[50]

2:如果我想保留数组的后半部分并释放前 50 个,我该怎么做。 所以我基本上得到了原始指针加上 50,但我得到的好像我做了char* arr = new char[50]

我可以做delete[99] arr; 并把它放在一个循环中。我可以通过重新分配数组来做到这一点,但我希望它尽可能快。

请不要在拼写和语法问题上纠缠我,我知道我需要在这方面做得更好。

【问题讨论】:

  • 如果快速是您最关心的问题,为什么在您仍然需要另一半的时候释放一半的数组?
  • 您不能释放分配的一部分。要么全有,要么全无。您能做的最好的事情是获得较小的分配并将您需要的内容复制到新分配中,或者让一半的分配未使用。
  • 因为我正在制作一个任意精度的整数库,如果我想移位超过 64 位,我需要移位四字(uint64_t),如果我移动指针它比重新移动要快分配,但如果我移动指针,就会忘记内存
  • 注意:不要混用 reallocnewThat way lies madness.

标签: c++ arrays c++11 memory-management


【解决方案1】:

您根本无法更改通过new 分配的大小。

如果通过std::malloc(或朋友)分配,原则上可以使用std::realloc告诉系统分配器你不需要后半部分,但前半部分是不可能的我认为这样做是否有任何好处值得怀疑。

另外,std::malloc 不会在 C++20 之前创建对象,因此如果没有未定义的行为,使用起来会非常复杂。 (特别是一个数组不能被实际放置到它里面。)

cmets 中提到的用例的解决方案是在结构中使用两个指针而不是一个:一个指针指向分配的开头,一个指针指向已用空间的开头。你保留第一个左右,只在需要的时候调用delete[]就可以了,另一个可以用来表示实际数据的开始。

类似地,您将保留两个指向末尾的指针,一个指向分配的末尾,一个指向已使用部分的末尾(或两个整数表示两者的大小)。

【讨论】:

  • 感谢您的澄清,这是我将如何完成此操作
猜你喜欢
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 2012-09-24
相关资源
最近更新 更多