如何释放子阵列的mem,它是更大数组的一部分



我在动态删除内存方面遇到了一些麻烦。我有 100 个整数的数组,但稍后在运行时没有使用超过一半的数组,所以我想释放该内存。这是我的尝试。谁能解释为什么我会收到错误?谢谢!

void dynSybarrDel(){
int* intArr = new int[100];
int* subArr = (intArr + 50);
delete subArr;
}

但是,如果您恶意移动内存,则可以使用 realloc 删除到最后:

#include  <cstring>
void dynSybarrDel(){
int* intArr = (int*)malloc(100 * sizeof(int));
int* subArr = (intArr + 50);
intArr = realloc(intArr, (subArr - intArr)*sizeof(int));
};

编辑

要在内存中初始化特定类型的数组元素malloc只需这样做(但是您不需要在 int 或其他内置类型上执行此操作,当您知道它在读取之前被覆盖时,否则会有随机值(:

new(elementPtr) myType("parameter1", 2.0);

并破坏:

elementPtr->~myType();

elementPtr只是元素的地址,通过像这样的迭代:

MyType* elementPtr = myArr;
for(int i = arrSize; i; --i, ++elementPtr)

但是,如果你可以使用std::vector它允许你做更多的事情:

#include <vector>
void dynSybarrDel(){
std::vector<int> intArr(100);
auto subArr = intArr.begin() + 50;
intArr.erase(subArr, intArr.end());
};

您甚至可以删除矢量中的部分:

#include <vector>
#include <numeric>
int main() {
std::vector<int> intArr(10);
std::iota(intArr.begin(), intArr.end(), 0); // linear counting [0, 10)
for(int i: intArr) {
std::cout << i << ' ';
};
std::cout << 'n';

auto eraseMeBegin = intArr.begin() + 3;
auto eraseMeEnd   = intArr.end() - 2;
intArr.erase(eraseMeBegin, eraseMeEnd);
for(int i: intArr) {
std::cout << i << ' ';
};
std::cout << 'n';
};

生产输出:

0 1 2 3 4 5 6 7 8 9

0 1 2 8 9

这里的代码:int* intArr = new int[100];告诉编译器给出 4*100 的内存空间。 你基本上把它分配给你自己使用——在它回到内存池之前,没有人可以在你的程序旁边使用它。

因为编译器已经做了你告诉他做的事情(并给了你记忆(。 你不能要求他在运行时忽略它。 但是,您可以请求一半的空间,并在以后在程序上分配新内存。

重新分配新内存时,编译器首先尝试查看当前内存的扩展名是否可用且大小是否适合您。 如果是这样,它为您提供当前数组延续的地址,如果不是,它会将当前数组复制到另一个具有足够空间的内存地址(如果可能(。

相关内容

最新更新