Finally I have a valid reason to learn about memory management. It was also hella weird when encountering it.

  • henfredemars@infosec.pub
    link
    fedilink
    English
    arrow-up
    27
    ·
    edit-2
    3 days ago

    Not freeing your memory at all is a memory management strategy. I think some LaTeX compilers use it as well as surprisingly many Java applications.

    • entwine@programming.dev
      link
      fedilink
      arrow-up
      5
      ·
      2 days ago

      This non-sarcastically. The operating system is better at cleaning up memory than you, and it’s completely pointless to free all your allocations if you’re about to exit the program. For certain workloads, it can lead to cleaner, less buggy code to not free anything.

      It’s important to know the difference between a “memory leak” and unfreed memory. A leak refers to memory that cannot be freed because you lost track of the address to it. Leaks are only really a problem if the amount of leaked memory is unbounded or huge. Every scenario is different.

      Of course, that’s not an excuse to be sloppy with memory management. You should only ever fail to free memory intentionally.

      • henfredemars@infosec.pub
        link
        fedilink
        English
        arrow-up
        3
        ·
        edit-2
        2 days ago

        Absolutely. I once wrote a server for a factory machine that spawned child processes to work each job item. Intentionally we did not free any memory in the child process because it serves only one request and then exits anyway. It’s much more efficient to have the OS just clean up everything and provides strong guarantees that nothing can be left behind accidentally for a system where up time was money. Any code to manage memory was pointless line noise and extra developer effort.

        In fact I think in the linker we specifically replaced free with a function that does nothing.

    • GissaMittJobb@lemmy.ml
      link
      fedilink
      arrow-up
      2
      ·
      edit-2
      2 days ago

      Yeah, you can use the Epsilon garbage collector in Java for a no-op garbage collection strategy.

      For short-lived programs that do not risk hitting any memory constraints, it makes a lot of sense - zero time wasted on cleanup during execution, then you just do it all at the end when killing the program, which you can do in constant time since you don’t need to reason about what should remain or not.

    • csm10495@sh.itjust.works
      link
      fedilink
      English
      arrow-up
      5
      ·
      2 days ago

      Upvoted. This is something I learned rather recently. Sometimes it’s more performant to slowly leak than it would be to free properly. Then take x amount of time to restart every n amount of time.

      • henfredemars@infosec.pub
        link
        fedilink
        English
        arrow-up
        1
        ·
        2 days ago

        A middle ground is a memory pool or an object pool where you reuse the memory rather than free it. Instead, you free it all in one operation when that phase of your application is complete. I’ve seen this done for particle systems to reduce overhead.

    • wewbull@feddit.uk
      link
      fedilink
      English
      arrow-up
      8
      ·
      2 days ago

      .net

      Anything I run in C# or similar seems to allocate 512GB of virtual address space and then just populates what it actually uses.

    • da_cow (she/her)@feddit.orgOP
      link
      fedilink
      arrow-up
      7
      ·
      3 days ago

      That’s the funny thing. I had a (yet) very basic Programm and did not care at all about memory management. When I did some testing I realised, that for some reason when I printed string 1 I also got characters from string 2.

      • henfredemars@infosec.pub
        link
        fedilink
        English
        arrow-up
        12
        ·
        3 days ago

        That sounds like it could be memory corruption. That should not happen because every string should be separated by a null terminator.

        • da_cow (she/her)@feddit.orgOP
          link
          fedilink
          arrow-up
          9
          ·
          edit-2
          3 days ago

          This is the code I used:

          #include <stdio.h>
          #include <string.h>
          
          #define MAX_ACCOUNTS 255
          
          typedef struct
          {
              unsigned int id;
              char account_creation_date [10];
              char first_name [255];
              char last_name [255];
              char country_code [2];
              unsigned int iban;
              char password [255];
              double balance;
          } account;
          
          account accounts_db[MAX_ACCOUNTS];
          unsigned int accounts_created = 0;
          
          account get_account_id (unsigned int id)
          {
              int i = 0;
              while(i < MAX_ACCOUNTS)
              {
                  if(accounts_db[i].id == id)
                  {
                      return accounts_db[i];
                  }
                  i++;
              }
              account account;
              account.id = -1;
              return account;
          }
          
          void create_account(char first_name [255], char last_name [255], char password [255], char country_code [2])
          {
              account new_account;
              new_account.id = accounts_created;
              strcpy(new_account.first_name, first_name);
              strcpy(new_account.last_name, last_name);
              strcpy(new_account.password, password);
              strcpy(new_account.country_code, country_code);
              strcpy(new_account.account_creation_date, "");
              new_account.balance = 0.0;
              new_account.iban = 0;
              accounts_db[accounts_created] = new_account;
              accounts_created++;
          }
          
          int main()
          {
              char first_name [255]  = "Max";
              char last_name [255] = "Mustermann";
              char country_code [2] = "DE";
              char password [255]= "password";
              create_account(first_name, last_name, password,country_code);
              account account = get_account_id(0);
              printf("Name: %s %s \n", account.first_name, account.last_name);
              printf("Account creation date: %s\n", account.account_creation_date);
              printf("IBAN: %s %d", account.country_code, account.iban);
          }```
          
          When you run it you can see, that behind the country code of the IBAN you get the first two letters of the surename
          • LedgeDrop@lemmy.zip
            link
            fedilink
            arrow-up
            17
            ·
            3 days ago

            Without getting too critical of your code (congrats BTW), never use strcpy instead use strlcpy.

            strcpy will happily allow you to create buffer overflows (a common challenge with C) which will cause your application to crash.

            You’ll find more details here.

            Good luck!

            • da_cow (she/her)@feddit.orgOP
              link
              fedilink
              arrow-up
              9
              ·
              3 days ago

              Thanks, I did not knew this. I always appreciate constructive criticism. I am quite new to C so theres a shit ton of stuff I have never done or dont even know about.

            • ozymandias117@lemmy.world
              link
              fedilink
              English
              arrow-up
              6
              ·
              3 days ago

              And understand when you can use them…

              I’ve seen too much code following this advice blindly that just does something like

              strncpy(dst, src, strlen(src))

          • da_cow (she/her)@feddit.orgOP
            link
            fedilink
            arrow-up
            8
            ·
            3 days ago

            I found the mistake. Since the country code char array only has a size of 2 it overwrites the \0 char causing the memory to leak.

            • silasmariner@programming.dev
              link
              fedilink
              arrow-up
              16
              ·
              2 days ago

              Usually what’s meant by a memory leak is memory that’s allocated but never freed. Writing outside of array allocation would usually be considered an overflow. Which sounds kinda similar but is not the same.