内存释放 C++
Memory deallocation c++
我显然误解了使用delete
的东西。为什么这个程序填满了我的记忆?
void f(int* x){
x = new int[42];
}
int main(){
while(true){
int* x;
f(x);
delete[] x;
}
return 0;
}
如何从main
函数内部释放我在f
中分配的内存?
您实际上并没有修改外部函数中的x
变量。
为此,您必须依赖返回值 f
:
int* f(){
return new int[42];
}
int main(){
while(true){
int* x = f();
delete[] x;
}
return 0;
}
或者通过引用传递变量x
:
void f(int*& x){
x = new int[42];
}
int main(){
while(true){
int* x;
f(x);
delete[] x;
}
return 0;
}
或者使用指向指针的指针作为指向f
的参数:
void f(int** x){
*x = new int[42];
}
int main(){
while(true){
int* x;
f(&x);
delete[] x;
}
return 0;
}
等等...
函数中存在内存泄漏
void f(int* x){
x = new int[42];
}
您分配内存,但从不释放它。函数参数是函数的局部变量。该函数处理原始指针的副本。副本的任何更改都不会影响原始参数。
并且程序具有未定义的行为,因为指针x
未初始化。
int main(){
while(true){
int* x;
^^^^^^
f(x);
delete[] x;
}
return 0;
}
您需要通过引用传递原始指针。所以函数应该像这样定义
void f(int* &x){
x = new int[42];
}
并被称为喜欢
f(x);
或定义如下
void f(int* *x){
*x = new int[42];
}
并被称为喜欢
f( &x );
通过引用传递参数。您正在按值传递它。
所以你可能想做的是考虑构造一个使用 RAII 的函子/类/结构......
我的意思是标准库如何处理大量分配。
struct A {
A(){/*allocate mem*/}
~A(){/*deallocate mem*/}
}
对于您的特定功能,
void f(int** x);
很可能是您想要的签名。这将允许您通过指向数组的指针来修改数组。虽然。。。我仍然建议不要这样做...原因是如果您决定分配一堆数组怎么办?主要方法是否负责解除分配内存?
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在向量中释放指针?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 包含矢量指针的结构的内存释放问题
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 如果分配数组引发异常,是否应该释放该数组