簡體   English   中英

如何釋放更大數組的一部分的子數組的內存

[英]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;
}

但是,如果您分配內存,則可以使用realloc刪除到最后:

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

編輯

要在初始化特定類型的數組元素malloc ated內存只是這樣做(但你不必做這個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的存儲空間。 您基本上可以將其分配給自己使用-在程序返回到內存池之前,沒有人可以在程序旁邊使用它。

因為編譯器已經完成了您告訴他的操作(並給了您內存)。 您不能要求他在運行時忽略它。 但是,您可以請求一半的空間,然后在程序上分配新的內存。

在重新分配新內存時,編譯器首先嘗試查看您當前內存的擴展是否空閑並且大小合適。 如果是這樣,它將為您提供當前數組的延續地址;如果不是,它將當前數組復制到具有足夠空間的另一個內存地址(如果可能)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM