Hi all,
I’m studying a problem releated to memory leakage.
Now, there are many tools to check memory leakake at run-time (dynamic analysis), and some tools can check memory leakage at compile-time (static analysis). But I have some questions:
How do you think to prevent memory leakage from coding phase (without using tool)? (or In coding phase, what do you have to do to prevent memory leakage?)
I want to investigate from many programmers in many countries.
Can you help me?
Memory leak prevention methodogies
Started by c___newbie, Nov 13 2007 10:43 PM
17 replies to this topic
#1
Posted 13 November 2007 - 10:43 PM
|
|
|
#2
Posted 17 November 2007 - 05:48 AM
The basic technique is to make sure that for every malloc() there is a corresponding free(). This takes care of the most obvious problem, but is far from error proof. For example, if you have code like the following:
This type of situation can happen easily when dealing with data structures such as linked lists, where you'll have a pointer to the head of the list and the current node of the list, and each node has a pointer to the next node. When "deleting" the linked list you have to be very careful to free each node without losing access to the list in the process.
int * ptr;
for (i=1;i<10;i++){ptr=malloc(int);}
free(ptr);
will leak memory like crazy because the malloc is inside the loop, but the free is outside the loop.This type of situation can happen easily when dealing with data structures such as linked lists, where you'll have a pointer to the head of the list and the current node of the list, and each node has a pointer to the next node. When "deleting" the linked list you have to be very careful to free each node without losing access to the list in the process.
#3
Posted 18 November 2007 - 08:29 AM
I get lazy and use garbage collection. Let someone else worry about memory management :).
As I see it. Unless I need programs that are always instantly responsive (i.e. 10ms pauses are unacceptable) then there is little or no reason not to use conservative GC. It does not produce an overly undue overhead in terms of processor time (because the majority of the deallocation code is only called once per thousands of deallocations while with manual memory management it's called once per deallocation). The only real issue is that GC can cause intense spots of activity where the program locks up. This is not usually noticeable in most applications.
A lot of C++ programmers use smart pointers to implement reference counting GC. This can work at a near manual level of efficiency. The only issue is circular references but it does generally stabilise memory usage. For me that is the key, I want to be able to tell people that this application uses N MiB of memory. I don't care that it wastes O MiB as long as it wastes O statically and no more than O.
As I see it. Unless I need programs that are always instantly responsive (i.e. 10ms pauses are unacceptable) then there is little or no reason not to use conservative GC. It does not produce an overly undue overhead in terms of processor time (because the majority of the deallocation code is only called once per thousands of deallocations while with manual memory management it's called once per deallocation). The only real issue is that GC can cause intense spots of activity where the program locks up. This is not usually noticeable in most applications.
A lot of C++ programmers use smart pointers to implement reference counting GC. This can work at a near manual level of efficiency. The only issue is circular references but it does generally stabilise memory usage. For me that is the key, I want to be able to tell people that this application uses N MiB of memory. I don't care that it wastes O MiB as long as it wastes O statically and no more than O.
#4
Posted 19 May 2009 - 07:55 PM
Can you, please, tell me some tools to check memory leakake at run-time?
#5
Posted 20 May 2009 - 07:44 AM
There are a variety of tools, depending on your OS, compiler, etc. The best tool will depend on the details of your environment.
#6
Posted 20 May 2009 - 07:52 PM
OS-WinXP
environment- Microsoft Visual Studio 6.0
I was advised to use Deleaker. Is it really good?
environment- Microsoft Visual Studio 6.0
I was advised to use Deleaker. Is it really good?
#7
Posted 20 May 2009 - 09:09 PM
Maintain control of your memory region pointers.
Never use your pointer for the return value of realloc because realloc isn't required to succeed, it can fail and return NULL and you can lose track of your original block of allocated memory so.. use a temporary pointer.
Never use your pointer for the return value of realloc because realloc isn't required to succeed, it can fail and return NULL and you can lose track of your original block of allocated memory so.. use a temporary pointer.
#8
Posted 21 May 2009 - 03:15 AM
VS6 isn't very good. I haven't used Deleaker.
#9
Posted 21 May 2009 - 06:42 PM
Thanks
#10
Posted 27 May 2009 - 02:24 PM
One thing you can look into (and I mean carefully research before trying) is overloading the global new and delete operators.
Doing this will allow you (if nothing else) to keep a running total of all allocations, and deallocations made during your program's run time. If you have more allocations than deallocations, then you have a leak somewhere.
This setup can get far more advanced, but there's a start.
Doing this will allow you (if nothing else) to keep a running total of all allocations, and deallocations made during your program's run time. If you have more allocations than deallocations, then you have a leak somewhere.
This setup can get far more advanced, but there's a start.
Dave
#11
Posted 27 May 2009 - 03:38 PM
Using Boost::smart_ptr will do a lot to avoid memory leaks.
#12
Posted 28 May 2009 - 06:33 PM
On *nix systems, valgrind is a pretty good memory leak checker.
EDIT: It's definitely used in Linux, I think (but I'm not sure) that there's a Unix version as well.
EDIT: It's definitely used in Linux, I think (but I'm not sure) that there's a Unix version as well.


Sign In
Create Account

Back to top










