如何释放作为更大数组一部分的子数组的内存

How to free subarray's mem which is part of bigger array

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

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

但是如果你 malloc 内存,你可以用 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 的内存 space。你基本上将它分配给你自己使用 - 在它回到内存池之前没有人可以在你的程序旁边使用它。

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

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