Accessing struct memory allocated in C code from C# code

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP












0














I have a list of struct allocated from C code. I am returning the pointer of this struct list to C# code. And finally C# code is using this pointer and marshaling it into a corresponding C# struct list. Both C and C# code are bundled together.



I wanted to confirm is there any possibility of memory corruption in this scenario or can there be case in which we lose handle to the memory pointer is pointing. When will the memory allocated from C code be destroyed.



Below is a snippet of the code.



Sample C Code



 typedef struct sampleData 
int id;
int sid;
SampleData;

SampleData* func()
SampleData* pd = (SampleData*) malloc(10 * sizeof(SampleData)) ;
for(int i=0;i<10;i++)
pd[i].id=i*10;
pd[i].sid=i*10;

return pd;



sample C# code



class Test

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct TestData

[MarshalAs(UnmanagedType.I4)]
public int id;
[MarshalAs(UnmanagedType.I4)]
public int sid;


[DllImport("sample.so", EntryPoint = "func")]
static extern IntPtr func();

public void collectSampleData()

IntPtr idPtr = IntPtr.Zero;
IntPtr sidPtr = IntPtr.Zero;
idPtr = func();

for(int i=0;i<10;i++)

TestData TestDataObj=new TestData();

IntPtr currPtr = new IntPtr(idPtr.ToInt64() + ( i * Marshal.SizeOf(typeof(TestData))));

TestDataObj = (TestData)Marshal.PtrToStructure(currPtr,typeof(TestData));

Console.WriteLine(TestDataObj.id+" "TestDataObj.sid);






In the above code is there a possibility to loose the handle of memory allocation done for Sampledata struct list when accessing from C# side. As the above code for now is giving correct values.










share|improve this question













migrated from unix.stackexchange.com Dec 28 '18 at 14:10


This question came from our site for users of Linux, FreeBSD and other Un*x-like operating systems.



















    0














    I have a list of struct allocated from C code. I am returning the pointer of this struct list to C# code. And finally C# code is using this pointer and marshaling it into a corresponding C# struct list. Both C and C# code are bundled together.



    I wanted to confirm is there any possibility of memory corruption in this scenario or can there be case in which we lose handle to the memory pointer is pointing. When will the memory allocated from C code be destroyed.



    Below is a snippet of the code.



    Sample C Code



     typedef struct sampleData 
    int id;
    int sid;
    SampleData;

    SampleData* func()
    SampleData* pd = (SampleData*) malloc(10 * sizeof(SampleData)) ;
    for(int i=0;i<10;i++)
    pd[i].id=i*10;
    pd[i].sid=i*10;

    return pd;



    sample C# code



    class Test

    [StructLayout(LayoutKind.Sequential, Pack=1)]
    public struct TestData

    [MarshalAs(UnmanagedType.I4)]
    public int id;
    [MarshalAs(UnmanagedType.I4)]
    public int sid;


    [DllImport("sample.so", EntryPoint = "func")]
    static extern IntPtr func();

    public void collectSampleData()

    IntPtr idPtr = IntPtr.Zero;
    IntPtr sidPtr = IntPtr.Zero;
    idPtr = func();

    for(int i=0;i<10;i++)

    TestData TestDataObj=new TestData();

    IntPtr currPtr = new IntPtr(idPtr.ToInt64() + ( i * Marshal.SizeOf(typeof(TestData))));

    TestDataObj = (TestData)Marshal.PtrToStructure(currPtr,typeof(TestData));

    Console.WriteLine(TestDataObj.id+" "TestDataObj.sid);






    In the above code is there a possibility to loose the handle of memory allocation done for Sampledata struct list when accessing from C# side. As the above code for now is giving correct values.










    share|improve this question













    migrated from unix.stackexchange.com Dec 28 '18 at 14:10


    This question came from our site for users of Linux, FreeBSD and other Un*x-like operating systems.

















      0












      0








      0







      I have a list of struct allocated from C code. I am returning the pointer of this struct list to C# code. And finally C# code is using this pointer and marshaling it into a corresponding C# struct list. Both C and C# code are bundled together.



      I wanted to confirm is there any possibility of memory corruption in this scenario or can there be case in which we lose handle to the memory pointer is pointing. When will the memory allocated from C code be destroyed.



      Below is a snippet of the code.



      Sample C Code



       typedef struct sampleData 
      int id;
      int sid;
      SampleData;

      SampleData* func()
      SampleData* pd = (SampleData*) malloc(10 * sizeof(SampleData)) ;
      for(int i=0;i<10;i++)
      pd[i].id=i*10;
      pd[i].sid=i*10;

      return pd;



      sample C# code



      class Test

      [StructLayout(LayoutKind.Sequential, Pack=1)]
      public struct TestData

      [MarshalAs(UnmanagedType.I4)]
      public int id;
      [MarshalAs(UnmanagedType.I4)]
      public int sid;


      [DllImport("sample.so", EntryPoint = "func")]
      static extern IntPtr func();

      public void collectSampleData()

      IntPtr idPtr = IntPtr.Zero;
      IntPtr sidPtr = IntPtr.Zero;
      idPtr = func();

      for(int i=0;i<10;i++)

      TestData TestDataObj=new TestData();

      IntPtr currPtr = new IntPtr(idPtr.ToInt64() + ( i * Marshal.SizeOf(typeof(TestData))));

      TestDataObj = (TestData)Marshal.PtrToStructure(currPtr,typeof(TestData));

      Console.WriteLine(TestDataObj.id+" "TestDataObj.sid);






      In the above code is there a possibility to loose the handle of memory allocation done for Sampledata struct list when accessing from C# side. As the above code for now is giving correct values.










      share|improve this question













      I have a list of struct allocated from C code. I am returning the pointer of this struct list to C# code. And finally C# code is using this pointer and marshaling it into a corresponding C# struct list. Both C and C# code are bundled together.



      I wanted to confirm is there any possibility of memory corruption in this scenario or can there be case in which we lose handle to the memory pointer is pointing. When will the memory allocated from C code be destroyed.



      Below is a snippet of the code.



      Sample C Code



       typedef struct sampleData 
      int id;
      int sid;
      SampleData;

      SampleData* func()
      SampleData* pd = (SampleData*) malloc(10 * sizeof(SampleData)) ;
      for(int i=0;i<10;i++)
      pd[i].id=i*10;
      pd[i].sid=i*10;

      return pd;



      sample C# code



      class Test

      [StructLayout(LayoutKind.Sequential, Pack=1)]
      public struct TestData

      [MarshalAs(UnmanagedType.I4)]
      public int id;
      [MarshalAs(UnmanagedType.I4)]
      public int sid;


      [DllImport("sample.so", EntryPoint = "func")]
      static extern IntPtr func();

      public void collectSampleData()

      IntPtr idPtr = IntPtr.Zero;
      IntPtr sidPtr = IntPtr.Zero;
      idPtr = func();

      for(int i=0;i<10;i++)

      TestData TestDataObj=new TestData();

      IntPtr currPtr = new IntPtr(idPtr.ToInt64() + ( i * Marshal.SizeOf(typeof(TestData))));

      TestDataObj = (TestData)Marshal.PtrToStructure(currPtr,typeof(TestData));

      Console.WriteLine(TestDataObj.id+" "TestDataObj.sid);






      In the above code is there a possibility to loose the handle of memory allocation done for Sampledata struct list when accessing from C# side. As the above code for now is giving correct values.







      c memory-leaks c#






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Dec 28 '18 at 11:57









      PREETI BANSALPREETI BANSAL

      1




      1




      migrated from unix.stackexchange.com Dec 28 '18 at 14:10


      This question came from our site for users of Linux, FreeBSD and other Un*x-like operating systems.






      migrated from unix.stackexchange.com Dec 28 '18 at 14:10


      This question came from our site for users of Linux, FreeBSD and other Un*x-like operating systems.
























          1 Answer
          1






          active

          oldest

          votes


















          0














          As-is there should be no memory corruption coming from the managed code.



          However, the unmanaged memory will not be released at all unless you explicitly do something about it.



          "Traditional" APIs typically use two ways for dealing with this:



          • They accept a pointer (usually along with buffer size information) when calling, and store their data in the memory area the pointer points to. In this case they do not allocate memory as you do with malloc(), and the caller is responsible for providing the buffer and managing the memory. If the buffer is not large enough, the callee should return an error. Most Win32 APIs work this way (file access etc.).


          • They provide another call to release the memory. In this case both malloc() and free() are in your external code, and the managed side does not actively manage the memory but it has to notify the external code when the pointer is no longer in use. Note that COM does use a related approach with reference counting; when the counter reaches 0, the object is freed.






          share|improve this answer




















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53959846%2faccessing-struct-memory-allocated-in-c-code-from-c-sharp-code%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            As-is there should be no memory corruption coming from the managed code.



            However, the unmanaged memory will not be released at all unless you explicitly do something about it.



            "Traditional" APIs typically use two ways for dealing with this:



            • They accept a pointer (usually along with buffer size information) when calling, and store their data in the memory area the pointer points to. In this case they do not allocate memory as you do with malloc(), and the caller is responsible for providing the buffer and managing the memory. If the buffer is not large enough, the callee should return an error. Most Win32 APIs work this way (file access etc.).


            • They provide another call to release the memory. In this case both malloc() and free() are in your external code, and the managed side does not actively manage the memory but it has to notify the external code when the pointer is no longer in use. Note that COM does use a related approach with reference counting; when the counter reaches 0, the object is freed.






            share|improve this answer

























              0














              As-is there should be no memory corruption coming from the managed code.



              However, the unmanaged memory will not be released at all unless you explicitly do something about it.



              "Traditional" APIs typically use two ways for dealing with this:



              • They accept a pointer (usually along with buffer size information) when calling, and store their data in the memory area the pointer points to. In this case they do not allocate memory as you do with malloc(), and the caller is responsible for providing the buffer and managing the memory. If the buffer is not large enough, the callee should return an error. Most Win32 APIs work this way (file access etc.).


              • They provide another call to release the memory. In this case both malloc() and free() are in your external code, and the managed side does not actively manage the memory but it has to notify the external code when the pointer is no longer in use. Note that COM does use a related approach with reference counting; when the counter reaches 0, the object is freed.






              share|improve this answer























                0












                0








                0






                As-is there should be no memory corruption coming from the managed code.



                However, the unmanaged memory will not be released at all unless you explicitly do something about it.



                "Traditional" APIs typically use two ways for dealing with this:



                • They accept a pointer (usually along with buffer size information) when calling, and store their data in the memory area the pointer points to. In this case they do not allocate memory as you do with malloc(), and the caller is responsible for providing the buffer and managing the memory. If the buffer is not large enough, the callee should return an error. Most Win32 APIs work this way (file access etc.).


                • They provide another call to release the memory. In this case both malloc() and free() are in your external code, and the managed side does not actively manage the memory but it has to notify the external code when the pointer is no longer in use. Note that COM does use a related approach with reference counting; when the counter reaches 0, the object is freed.






                share|improve this answer












                As-is there should be no memory corruption coming from the managed code.



                However, the unmanaged memory will not be released at all unless you explicitly do something about it.



                "Traditional" APIs typically use two ways for dealing with this:



                • They accept a pointer (usually along with buffer size information) when calling, and store their data in the memory area the pointer points to. In this case they do not allocate memory as you do with malloc(), and the caller is responsible for providing the buffer and managing the memory. If the buffer is not large enough, the callee should return an error. Most Win32 APIs work this way (file access etc.).


                • They provide another call to release the memory. In this case both malloc() and free() are in your external code, and the managed side does not actively manage the memory but it has to notify the external code when the pointer is no longer in use. Note that COM does use a related approach with reference counting; when the counter reaches 0, the object is freed.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Dec 28 '18 at 14:29









                LuceroLucero

                51.7k591142




                51.7k591142



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53959846%2faccessing-struct-memory-allocated-in-c-code-from-c-sharp-code%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown






                    Popular posts from this blog

                    How to check contact read email or not when send email to Individual?

                    Bahrain

                    Postfix configuration issue with fips on centos 7; mailgun relay