в

Kazan Dev Alliance

Казанское Сообщество Разработчиков Программного Обеспечения

Про освобождение памяти.

Last post 09-27-2006 14:21 by Wataru. 10 replies.
Page 1 of 1 (11 items)
Sort Posts: Previous Next
  • 09-23-2006 14:42

    • SixDays
    • Top 25 Contributor
      Male
    • Joined on 07-28-2006
    • Казань
    • Points 275

    Про освобождение памяти.

    Вот интересно, что будет в следующей ситуации:

    В коде на C# я создаю байтовый массив (byte[]), далее его отдаю по ссылке в функцию, импортированную из C++ dll (pinvoke), то есть этот массив отправляется в unmanaged код, и дальше там производятся с ним некие действия, в том числе и выделяется память каким-нибудь malloc. В результате в C# я имею заполненный массив.

    Так вот, обычно после malloc нужно за собой память подчищать в C++, вызовом free. А в данном случае, если я вызову free, то в C# я естественно не получу никакого массива. Допустим, я не отчистил память в C++, т.к.массив я в дальнейшем пользую в C#.

    Вопрос: что станет с массивом байт после того когда он мне уже будет не нужен, сработает ли сборщик мусора .NET Framework?

    Теги:
    • Post Points: 50
  • 09-23-2006 15:07 In reply to

    Re: Про освобождение памяти.

    В FW 2.0 однозначно должен. Если только у тебя этот массив нигде больше не зацеплен... А для работы с объектами классов реализующих IDisposable еще посоветую использовать using.

    • Post Points: 20
  • 09-23-2006 15:23 In reply to

    • SixDays
    • Top 25 Contributor
      Male
    • Joined on 07-28-2006
    • Казань
    • Points 275

    Re: Про освобождение памяти.

    Что за IDisposable? Под "где-нибудь зацеплен", ты что имел ввиду? Меня интересует, в результате .NET мне память, выделенную под массив и C++ dll'ки освободит или нет.
    Теги:
    • Post Points: 20
  • 09-23-2006 15:40 In reply to

    Re: Про освобождение памяти.

    Про IDisposable можешь посмотреть в мсдн, реализующие его классы должны реализовывать метод Dispose, который вызывается при уничтожении объекта. Зацеплен - используется еще где - нибудь. Я не понял, массив создается в дотнет и передается в длл или создается в длл и передается в дотнет?

    • Post Points: 20
  • 09-23-2006 15:54 In reply to

    • SixDays
    • Top 25 Contributor
      Male
    • Joined on 07-28-2006
    • Казань
    • Points 275

    Re: Про освобождение памяти.

    Создаётся в .NET, передаётся в dll, там инициализируется, заполняется, а потом используется в .NET
    Теги: ,
    • Post Points: 20
  • 09-23-2006 16:05 In reply to

    Re: Про освобождение памяти.

    Имхо, если больше массив нигде не используется (кстати присвой переменной, ссылающейся на массив внутри unmanaged библиотеки null) то должен освободиться в итоге.

    • Post Points: 20
  • 09-23-2006 16:34 In reply to

    • SixDays
    • Top 25 Contributor
      Male
    • Joined on 07-28-2006
    • Казань
    • Points 275

    Re: Про освобождение памяти.

    Ну я когда её внутрь передаю, она у меня естественно null. Иначе компилятор ругается на неинициализированную переменную.
    • Post Points: 20
  • 09-23-2006 16:35 In reply to

    Re: Про освобождение памяти.

    Я в том смысле, что избавиться надо ото всех ссылок внутри umanaged библиотеки.

    • Post Points: 5
  • 09-27-2006 1:31 In reply to

    • Raimon
    • Top 10 Contributor
      Male
    • Joined on 08-18-2006
    • Kazan
    • Points 2,181

    Re: Про освобождение памяти.

    вообще в общем случае, я бы предположил что память не освобождаеться сборщиком мусора, потому что он не может знать что его надо освободить.

    лучше освобождать самому.

    Rail Sabirov
    Microsoft Certified Application Developer
    Microsoft Student Partner
    • Post Points: 20
  • 09-27-2006 13:35 In reply to

    Re: Про освобождение памяти.

    Короче говоря, чтобы точно сказать, надо на код посмотреть. И управляемый и неуправляемый. Так что: Код в Студию!

    • Post Points: 5
  • 09-27-2006 14:21 In reply to

    • Wataru
    • Top 25 Contributor
      Male
    • Joined on 09-27-2006
    • Kazan
    • Points 249

    Re: Про освобождение памяти.

    Answer
    Читай MSDN. Однозначно можно сказать, что если ты выделяешь массив в управляемом коде, то сборщик мусора его потом попытается собрать (явно твоим вызовом или потом как-нть), в неуправляемом коде можно безопасно лишь изменить содержимое масива. Если ты выделяешь в неуправляемом коде блок памяти, изволь в этом же неуправляемом коде его освободить. Эта память выделяется в хипе неуправляемого кода. А за всякое перевыделение управляемой памяти в неуправляемых длл-ках надо заставлять писать на ассемблере, чтобы неповадно было :)
    Without C we would BASI, PASAL & OBOL :)
    • Post Points: 29
Page 1 of 1 (11 items)

© 2007 Kazan Developers Community and Post`s Authors