如何释放作为更大数组一部分的子数组的内存
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(如果可能)的内存地址。
我在动态删除内存方面遇到了一些问题。我有 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(如果可能)的内存地址。