Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Memory leak when return char* from DLL

Memory leak when return char* from DLL

Scheduled Pinned Locked Moved C / C++ / MFC
22 Posts 7 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Shivanand Gupta

    Hi , I have a problem of memory leak when we call a function from win 32 DLL in our MFC program. DLL is C type and return value of my DLL is Char* and it is locally defined in function of DLL. and size is 1024 byte. when functon call four times then MFC application hold 4 KB Extra memory.

    R Offline
    R Offline
    Rajesh R Subramanian
    wrote on last edited by
    #2

    Is the DLL allocating memory that the char* points to, on the heap? Probably then the calling application must free this memory up? Do you have any docs for that DLL? Or if you have the source code, you may verify this.

    It is a crappy thing, but it's life -^ Carlo Pallini

    S 1 Reply Last reply
    0
    • S Shivanand Gupta

      Hi , I have a problem of memory leak when we call a function from win 32 DLL in our MFC program. DLL is C type and return value of my DLL is Char* and it is locally defined in function of DLL. and size is 1024 byte. when functon call four times then MFC application hold 4 KB Extra memory.

      A Offline
      A Offline
      Akt_4_U
      wrote on last edited by
      #3

      When returning char* as return value, you must allocate memory in heap(using malloc or new), from your DLL and deallocate this memory(free or delete) after usage from the calling applciation.

      prvn

      S 1 Reply Last reply
      0
      • A Akt_4_U

        When returning char* as return value, you must allocate memory in heap(using malloc or new), from your DLL and deallocate this memory(free or delete) after usage from the calling applciation.

        prvn

        S Offline
        S Offline
        Shivanand Gupta
        wrote on last edited by
        #4

        i m using New and Delete in calling application(MFC). but "delete []cData;" line have error runtime. if we use cData='\0' and after this "delete []cData;" then memory leak still continue.

        I S N 3 Replies Last reply
        0
        • R Rajesh R Subramanian

          Is the DLL allocating memory that the char* points to, on the heap? Probably then the calling application must free this memory up? Do you have any docs for that DLL? Or if you have the source code, you may verify this.

          It is a crappy thing, but it's life -^ Carlo Pallini

          S Offline
          S Offline
          Shivanand Gupta
          wrote on last edited by
          #5

          i m using New and Delete in calling application(MFC). but "delete []cData;" line have error runtime. if we use cData='\0' and after this "delete []cData;" then memory leak still continue. how can free memory in MFC application.

          R 1 Reply Last reply
          0
          • S Shivanand Gupta

            i m using New and Delete in calling application(MFC). but "delete []cData;" line have error runtime. if we use cData='\0' and after this "delete []cData;" then memory leak still continue. how can free memory in MFC application.

            R Offline
            R Offline
            Rajesh R Subramanian
            wrote on last edited by
            #6

            If the memory is allocated with new in the DLL, then clean it up with delete after you've used the data. Where is the difficulty? I don't see anything more to 'discuss' about here.

            It is a crappy thing, but it's life -^ Carlo Pallini

            S 1 Reply Last reply
            0
            • S Shivanand Gupta

              i m using New and Delete in calling application(MFC). but "delete []cData;" line have error runtime. if we use cData='\0' and after this "delete []cData;" then memory leak still continue.

              I Offline
              I Offline
              Iain Clarke Warrior Programmer
              wrote on last edited by
              #7

              shivanandgupta wrote:

              if we use cData='\0' and after this "delete []cData;" then memory leak still continue.

              That should not be a surprise... Either you are just making a silly mistake (which we all do), or it's a bit more complex and you are allocating and freeing from different heaps. This could happen if you statically link to the C++ runtime. One simple choice would be to use IMalloc to allocate / free chunks of memory. Look at CoGetMalloc etc for documentation. I still think it's likely to be something dumb... Are you sure the memory is not already freed elsewhere? Iain.

              In the process of moving to Sweden for love (awwww). If you're in Scandinavia and want an MVP on the payroll (or happy with a remote worker), give me a job!

              S 1 Reply Last reply
              0
              • R Rajesh R Subramanian

                If the memory is allocated with new in the DLL, then clean it up with delete after you've used the data. Where is the difficulty? I don't see anything more to 'discuss' about here.

                It is a crappy thing, but it's life -^ Carlo Pallini

                S Offline
                S Offline
                Shivanand Gupta
                wrote on last edited by
                #8

                Actually i am using static linking a dll. so when we used delete then runtime error occor about heap

                1 Reply Last reply
                0
                • I Iain Clarke Warrior Programmer

                  shivanandgupta wrote:

                  if we use cData='\0' and after this "delete []cData;" then memory leak still continue.

                  That should not be a surprise... Either you are just making a silly mistake (which we all do), or it's a bit more complex and you are allocating and freeing from different heaps. This could happen if you statically link to the C++ runtime. One simple choice would be to use IMalloc to allocate / free chunks of memory. Look at CoGetMalloc etc for documentation. I still think it's likely to be something dumb... Are you sure the memory is not already freed elsewhere? Iain.

                  In the process of moving to Sweden for love (awwww). If you're in Scandinavia and want an MVP on the payroll (or happy with a remote worker), give me a job!

                  S Offline
                  S Offline
                  Shivanand Gupta
                  wrote on last edited by
                  #9

                  Thanks for Reply i am calling DLL statically

                  1 Reply Last reply
                  0
                  • S Shivanand Gupta

                    i m using New and Delete in calling application(MFC). but "delete []cData;" line have error runtime. if we use cData='\0' and after this "delete []cData;" then memory leak still continue.

                    S Offline
                    S Offline
                    Shivanand Gupta
                    wrote on last edited by
                    #10

                    i don't have any idea to use Imalloc and cogetmalloc function to free memory. i m using statically DLL not a COM

                    1 Reply Last reply
                    0
                    • S Shivanand Gupta

                      Hi , I have a problem of memory leak when we call a function from win 32 DLL in our MFC program. DLL is C type and return value of my DLL is Char* and it is locally defined in function of DLL. and size is 1024 byte. when functon call four times then MFC application hold 4 KB Extra memory.

                      D Offline
                      D Offline
                      Dominik Reichl
                      wrote on last edited by
                      #11

                      If the DLL allocates the memory using new, it should also be the one to delete[] it. So, let the DLL export a new function to free memory. In your MFC program, you'd call the original method to allocate the char*, and afterwards you'd pass this pointer to the freeing function of the DLL, which would just delete[] it.


                      Too many passwords to remember? Try KeePass Password Safe!

                      R 1 Reply Last reply
                      0
                      • D Dominik Reichl

                        If the DLL allocates the memory using new, it should also be the one to delete[] it. So, let the DLL export a new function to free memory. In your MFC program, you'd call the original method to allocate the char*, and afterwards you'd pass this pointer to the freeing function of the DLL, which would just delete[] it.


                        Too many passwords to remember? Try KeePass Password Safe!

                        R Offline
                        R Offline
                        Rolf Kristensen
                        wrote on last edited by
                        #12

                        If the application is being build with the runtime libary (CRT) as a DLL (Recommended by Microsoft), then it should be possible to delete memory in the application that have been allocated by the DLL.

                        D 1 Reply Last reply
                        0
                        • R Rolf Kristensen

                          If the application is being build with the runtime libary (CRT) as a DLL (Recommended by Microsoft), then it should be possible to delete memory in the application that have been allocated by the DLL.

                          D Offline
                          D Offline
                          Dominik Reichl
                          wrote on last edited by
                          #13

                          Correct. Based on the original question and replies, it was my impression that different heaps/CRTs are being used (see static linkage post), that's why I suggested this way. Of course, using only one CRT will solve the problem, too.


                          Too many passwords to remember? Try KeePass Password Safe!

                          S R 2 Replies Last reply
                          0
                          • D Dominik Reichl

                            Correct. Based on the original question and replies, it was my impression that different heaps/CRTs are being used (see static linkage post), that's why I suggested this way. Of course, using only one CRT will solve the problem, too.


                            Too many passwords to remember? Try KeePass Password Safe!

                            S Offline
                            S Offline
                            Shivanand Gupta
                            wrote on last edited by
                            #14

                            I m unable to use CRT can u give some kind of code

                            R 1 Reply Last reply
                            0
                            • D Dominik Reichl

                              Correct. Based on the original question and replies, it was my impression that different heaps/CRTs are being used (see static linkage post), that's why I suggested this way. Of course, using only one CRT will solve the problem, too.


                              Too many passwords to remember? Try KeePass Password Safe!

                              R Offline
                              R Offline
                              Rolf Kristensen
                              wrote on last edited by
                              #15

                              Thank you for confirming this. I'm in a situation myself where I'm considering to convert static-libraries into DLL's to improve linker times. The entire application is already using runtime library as DLL, so the conversion should be a matter of exporting all needed classes in the static libraries.

                              1 Reply Last reply
                              0
                              • S Shivanand Gupta

                                I m unable to use CRT can u give some kind of code

                                R Offline
                                R Offline
                                Rolf Kristensen
                                wrote on last edited by
                                #16

                                Just follow what Dominik Reichl said in the first comment about ensuring that memory allocated in the DLL is released by the DLL again. Return the char-pointer to the DLL and let the DLL release it again.

                                S 1 Reply Last reply
                                0
                                • R Rolf Kristensen

                                  Just follow what Dominik Reichl said in the first comment about ensuring that memory allocated in the DLL is released by the DLL again. Return the char-pointer to the DLL and let the DLL release it again.

                                  S Offline
                                  S Offline
                                  Shivanand Gupta
                                  wrote on last edited by
                                  #17

                                  return data char* is locally defined in DLL. so how can release memory of that variable after returning char* variable

                                  R 1 Reply Last reply
                                  0
                                  • S Shivanand Gupta

                                    return data char* is locally defined in DLL. so how can release memory of that variable after returning char* variable

                                    R Offline
                                    R Offline
                                    Rolf Kristensen
                                    wrote on last edited by
                                    #18

                                    When returning the char* then you take a copy of the char*, but they both point to the same memory in the heap of the DLL. Just pass the copy of the char* from the application to the DLL again, and let the DLL release the memory in its heap. You might consider returning a CString instead of a char*, and ensure that when the CString moves from DLL boundary to the Application boundary that a copy is made of the CString.

                                    S 1 Reply Last reply
                                    0
                                    • S Shivanand Gupta

                                      i m using New and Delete in calling application(MFC). but "delete []cData;" line have error runtime. if we use cData='\0' and after this "delete []cData;" then memory leak still continue.

                                      N Offline
                                      N Offline
                                      Niklas L
                                      wrote on last edited by
                                      #19

                                      shivanandgupta wrote:

                                      if we use cData='\0' and after this "delete []cData;" then memory leak still continue.

                                      Well, if you set cData to '\0' you are manipulating the pointer, not the data it contains. cData is set to null, and that is what you try to delete (and it always succeeds.) Doesn't the DLL supply an API for freeing this string? IMHO dll's should always be designed that way.

                                      home

                                      S 1 Reply Last reply
                                      0
                                      • R Rolf Kristensen

                                        When returning the char* then you take a copy of the char*, but they both point to the same memory in the heap of the DLL. Just pass the copy of the char* from the application to the DLL again, and let the DLL release the memory in its heap. You might consider returning a CString instead of a char*, and ensure that when the CString moves from DLL boundary to the Application boundary that a copy is made of the CString.

                                        S Offline
                                        S Offline
                                        Shivanand Gupta
                                        wrote on last edited by
                                        #20

                                        I have try but it is not working. return char* is defined in dll's function as a local variable. it will work well when we defined static variable. but i don't want to create static variable in my DLL.

                                        1 Reply Last reply
                                        0
                                        • N Niklas L

                                          shivanandgupta wrote:

                                          if we use cData='\0' and after this "delete []cData;" then memory leak still continue.

                                          Well, if you set cData to '\0' you are manipulating the pointer, not the data it contains. cData is set to null, and that is what you try to delete (and it always succeeds.) Doesn't the DLL supply an API for freeing this string? IMHO dll's should always be designed that way.

                                          home

                                          S Offline
                                          S Offline
                                          Shivanand Gupta
                                          wrote on last edited by
                                          #21

                                          if we use delete without using '\0' then problem occur about heap at run time.

                                          N 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups