Memory leak C++

后端 未结 10 538
野趣味
野趣味 2021-02-02 06:02

I just wrote a code in C++ which does some string manipulation, but when I ran valgrind over, it shows some possible memory leaks. Debugging the code to granular level I wrote a

相关标签:
10条回答
  • 2021-02-02 06:39

    Use return 0; instead of exit(0); at the end of main. The use of exit circumvents the execution of the destructors.

    0 讨论(0)
  • 2021-02-02 06:42

    To avoid the memory leak, return the status from main instead of calling exit. If you're returning zero, you can omit the return statement if you like; the program will exit with a status of zero in that case.

    This also raise another question for me, is such a code harmful?

    On a modern operating system, it won't cause any harm - all resources are reclaimed automatically when a program terminates. However, it does make it harder to use tools like Valgrind to find genuine problems, so it's best to avoid even harmless memory leaks if you can.

    0 讨论(0)
  • 2021-02-02 06:47

    To add a different opinion.

    Such code is not harmful hat all. The OS will care for everything when the process terminates. Everything else results in an unstable OS. Just ensure that your persistent data (files, ...) is consistent.

    To go a bit further and provocatively states, explicitly freeing memory on program exit can be harmful.

    1. Program exit takes longer (Did you ever get annoyed to wait for a program to exit until the computer shuts down?)
    2. The correct order of destruction is not always trivial, especially with 3rd party components (I remember some programs that likely crash on exit)
    3. The OS may not let you free memory after leaving main(*) and kill your program instead

    Do you risk this just to make Valgrind give you a specific output?(**)


    (*)

    #include<iostream>
    using namespace std;
    std::string myname("Is there any leaks");
    int main() {
            exit(0);
    }
    

    (**) Well, of course the output of any memory analyzer is more useful without "noise". What about only freeing memory explicitly on exit in debug mode?

    0 讨论(0)
  • 2021-02-02 06:50

    In most cases, it's worth cleaning up after yourself, for the many good reasons already given: better maintainability, better utility from checking tools and so on.

    If there are other functional reasons to clean up, maybe your data is saved to a persistent store, then you have no choice - you must clean up (although you might want to reconsider your design).

    In some cases however, it may be better to just exit and "leak".

    At the end of a program, your process is going to exit. When it does so, the operating system will recover any memory allocated by your program and in some cases it can do this much more quickly.

    Consider a large linked list, where each node is dynamically allocated, and carries a substantial dynamically allocated structure. To clean this up you must visit each node and release each payload (which in turn may cause other complex structures to be walked).

    You may end up performing millions of memory operations to run through such a structure.

    The user wants to exit your program, and they sit there for 10s of seconds waiting for a bunch of junk processing to happen. They cannot possibly be interested in the result - they're quitting the program after all.

    If you let this "leak", the operating system can reclaim the entire block of memory allocated to your process much more quickly. It doesn't care about the structures and any object cleanup.

    http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx

    Ultimately you must understand what your tools are telling you, to be sure you're using them properly.

    0 讨论(0)
  • 2021-02-02 06:54

    If you'd like to break an execution and pass a return code without surpassing destructors, throw an exception, and extract the return value from the exception in main().

    0 讨论(0)
  • 2021-02-02 06:55

    If you insist on using exit():

    #include<iostream>
    int main(){
        {
            std::string myname("Are there any leaks?");
        }
        exit(0);
    }
    

    Also, when you return from main the returned value becomes the application’s exit code. So if you want to pass an exit code, use return exitCode; in main() instead of exit.

    Regarding that part:

    This also raise another question for me, is such a code harmful?

    Yes, because it is a BAD programming habit.

    The OS will clean up any memory you failed to release, so as long as you haven't managed to eat all system memory and the page file, you shouldn't damage the OS.

    However, writing sloppy/leaky code might turn into habit, so relying on the OS for cleaning up your mess is a bad idea.

    0 讨论(0)
提交回复
热议问题