可能重复:
当你在malloc之后没有释放时真的会发生什么?
在C/C++中结束程序时,必须通过释放指针来清理.如果你没有释放内存会发生什么,比如你有一个指向int的指针并且在结束程序时没有删除它?内存是否仍然使用,只能通过重新启动释放,还是在程序结束时自动释放?在最后一种情况下,为什么要释放它,如果操作系统为你做的话?
如果在使用new分配数据后没有调用delete运算符会发生什么.我知道已经分配的数据在发布之前不可用,但在结束程序之后?
为什么PC似乎有恶心的xD,我的意思是它非常慢,但过了一段时间它的性能变得更好但不像程序执行之前?
注意:我正在运行Windows XP.
当程序关闭时,分配的新内存是否总是被释放?(即使从错误/错误等意外关闭,或自定义关闭功能)?
或者它是否仅在从main返回时释放内存?
在这个网站(cplusplus.com)上,我读到了通过调用exit()不会破坏带有自动存储的对象.这是否意味着内存泄漏?我知道当你到达自动变量范围的末尾时,它们将被销毁,但是在这种情况下是否意味着我们没有达到范围的结束而只是离开程序?
我很好奇在这个例子中我会在论坛中发现内存会发生什么:
C++代码
#include <cstdlib>
#include <iostream>
struct C
{
~C()
{
std::cout<<"X"<<std::endl;
}
};
void f()
{
C c;
exit(1);
}
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
这里没有输出"X"所以没有调用析构函数.我们可以说它是内存泄漏吗?
编辑:
谢谢你的回复.但我想澄清其他一些事情.假设操作系统在程序完成后不会释放内存,这是否意味着在exit()之后调用具有自动存储的对象会导致内存泄漏(因为它不会被破坏)?或者它可能只发生在使用例如operator new的堆分配内存时?
也许我提出的问题不太清楚,但我想知道在任何情况下是否销毁了自动存储的对象,即使程序在块结束之前没有到达并且被exit()调用中断.
我有一个带有 for 循环的函数,在循环内部(并且取决于输入)某些变量使用以下命令初始化一次(第一次)malloc()。
这些变量的声明如下:
static double *vector;
然后我使用分配内存
malloc(size*sizeof(double));
Run Code Online (Sandbox Code Playgroud)
问题是:
我是否必须在被调用函数内循环的最后一次迭代中释放这些变量?
更新:也许我对某些人的解释是错误的。问题是被调用的函数(func_A)根据主函数的输入为其使用的某些向量分配内存。然后,这个 func_A 在主循环中被多次调用。这就是为什么我将变量定义为静态变量,以便每次调用 func_A 时都不会定义它们(出于时间消耗的问题),因为尺寸在整个运行过程中不会改变。这些变量是静态的但不是全局的,所以我无法将它们从 main 中释放(对吗?)。
我们为什么需要free()?像NULL类似的工作一样放置头节点,不是吗?
我有一个关于 C++ 中的内存管理的问题。据我所知,Java 中不需要释放内存,因为未使用的对象会在某个时候被 JVM 垃圾收集器删除。我的意思是,如果我在C++中忘记释放内存,使用的内存地址会被占用,直到我重新启动机器并且内存中的数据丢失?例如,在下面的代码中,我有一个简单的链表,您可以观察到我没有释放内存(在析构函数中进行了注释):
#include <iostream>
using namespace std;
typedef struct Node{
Node* next;
int id;
} *ListPtr;
class LinkedList{
public:`ListPtr header;
LinkedList(){
header = NULL;
}
~LinkedList(){
/*
ListPtr a = header,b;
while(a != NULL)
{
b = a;
a = a -> next;
delete b;
}
delete a,b;
cout << "Memory freed!"<< endl;
*/
}
public: void Insert(){
ListPtr new_element = new Node;
new_element -> next = NULL;
if(header == NULL){
header = new_element;
header -> …Run Code Online (Sandbox Code Playgroud) 据我所知,如果你正在分配内存以临时存储某些内容,比如响应用户操作,并且当代码再次到达那一点时你就不再需要内存了,你应该释放内存以便它不会不会造成泄漏.如果不清楚,这里有一个例子,我知道释放内存很重要:
#include <stdio.h>
#include <stdlib.h>
void countToNumber(int n)
{
int *numbers = malloc(sizeof(int) * n);
int i;
for (i=0; i<n; i++) {
numbers[i] = i+1;
}
for (i=0; i<n; i++) {
// Yes, simply using "i+1" instead of "numbers[i]" in the printf would make the array unnecessary.
// But the point of the example is using malloc/free, so pretend it makes sense to use one here.
printf("%d ", numbers[i]);
}
putchar('\n');
free(numbers); // Freeing is absolutely necessary here; …Run Code Online (Sandbox Code Playgroud) 如果你没有释放你在Linux下的C程序中使用malloc的内存,它什么时候发布?程序终止后?或者内存是否仍然被锁定,直到一个不可预见的时间(可能在重新启动时)?
我有一个函数计算mandelbrot集我试图使用它并行化openMP.
我#pragma omp parallel for private在每个之前for
static void calculer (Image * im, int nb_iter, double x_min, double x_max, double y_min, double y_max) {
/* Discretisation de l'ensemble */
double pasx = (x_max - x_min) / im -> nb_col;
double pasy = (y_max - y_min) / im -> nb_lig;
double cy = y_min;
double new_zx;
unsigned int l,c;
// Calcul
#pragma omp parallel for private ( pasx, pasy, im,nb_iter,x_min,x_max,y_min, y_max)
for (l = 0; …Run Code Online (Sandbox Code Playgroud) c ×6
c++ ×5
memory ×4
free ×3
memory-leaks ×2
internals ×1
linked-list ×1
linux ×1
malloc ×1
mandelbrot ×1
openmp ×1
pointers ×1