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

    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
                                  • S Shivanand Gupta

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

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

                                    Well, setting it to '\0' is the same as setting it to NULL. In either case, it makes the delete call a no-op, and that's why you don't get a crash, but you DO get a memory leak.

                                    home

                                    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