[英]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.