What is the difference between memory leak, accessing freed memory and double free?

落花浮王杯 提交于 2021-01-28 00:13:09

问题


I'm trying to figure out what is the difference between those three kinds of problems associated with memory models.

If I want to simulate a memory leak scenario, I can create a pointer without calling corresponding delete method.

int main() {
    // OK
    int * p = new int;
    delete p; 

    // Memory leak
    int * q = new int;
    // no delete
}

If I want to simulate a double free scenario, I can free a pointer twice and this part memory will be assigned twice later.

a = malloc(10);     // 0xa04010
b = malloc(10);     // 0xa04030
c = malloc(10);     // 0xa04050

free(a);
free(b);  // To bypass "double free or corruption (fasttop)" check
free(a);  // Double Free !!

d = malloc(10);     // 0xa04010
e = malloc(10);     // 0xa04030
f = malloc(10);     // 0xa04010   - Same as 'd' !

However, I don't know what is accessing freed memory. Can anybody give me an example of accessing freed memory?


回答1:


  1. Memory leaks are bad.
  2. Double frees are worse.
  3. Accessing freed memory is worser.

Memory leaks

This is not an error per se. A leaking program is stil valid. It may not be a problem. But this is still bad; with time, your program will reserve memory from the host and never release it. If the host's memory is full before the program completion, you run into troubles.

Double frees

Per the standard, this is undefined behaviour. In practice, this is almost always a call to std::abort() by the C++ runtime.

Accessing freed memory

Also undefined behaviour. But in some case, nothing bad will happen. You'll test your program, put it in production. And some day, for no apparent reason, it will break. And it will break hard: randomly. The best time to rework your résumé.

And here is how to access freed memory:

// dont do this at home
int* n = new int{};
delete n;
std::cout << *n << "\n"; // UNDEFINED BEHAVIOUR. DONT.



回答2:


Your examples of a memory leak (allocating memory but freeing it) and double-free (passing a pointer to allocated memory to free / delete more than once) are correct.

Performing a double-free does not however mean that a section of memory will be returned more than once by malloc as your example indicates. What it does do is invoke undefined behavior, meaning the behavior of your program cannot be predicted going forward.

Accessing free'ed memory means freeing a pointer and then subsequently trying to use it:

int *a = malloc(10 * sizeof(int));     // allocate memory
free(a);                               // free memory
print("a[0]=%d\n", a[0]);              // illegal: use after free



回答3:


You are correct about making a memory leak and a double-free. Accessing freed memory happens when you dereference a pointer that has been freed:

int *ptr = malloc(sizeof(int));
*ptr = 123;
free(ptr);
int invalid = *ptr; // Accessing freed memory

Problems like this are notoriously hard to detect, because the program continues to work as expected for some time. If you expect to reuse the pointer variable at some later time, it is a good idea to assign it NULL immediately after calling free. This way a subsequent dereference would fail fast.




回答4:


I'm trying to figure out what is the difference between those three kinds of problems associated with memory models.

  • memory leak - you dynamically allocate memory and never release it.

  • double free - you dynamically allocate memory and release it multiple times

  • accessing after free - you dynamically allocate memory then release and access that memory after release.



来源:https://stackoverflow.com/questions/47533487/what-is-the-difference-between-memory-leak-accessing-freed-memory-and-double-fr

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!