Как повторно инициализировать объект в C # в том же месте памяти с точки зрения C ++ (или это делается автоматически)? - PullRequest
0 голосов
/ 23 сентября 2018

В C ++ я использовал такие конструкции, как

#include "stdafx.h"
#include "TestStaticPointer.h"

MyClass* MyClass::myStaticPointer;

int main()
{
    ProgrammStart();

    return 0;
}

void ProgrammStart()
{
    MyClass::myStaticPointer = new MyClass();
}

void SomeProgrammPlace()
{
    *MyClass::myStaticPointer = MyClass();
}

Так что я выделил память только один раз в ProgrammStart (), а затем я использовал то же место памяти для повторной инициализации моего статического указателя (без перераспределения с помощью 'new')Я только что использовал конструкцию "= MyClass ();".

Как я могу сделать это в C #?Берет ли IL всю работу по распределению?Всегда ли «новый» означает «новое» место в памяти (а не то же место в памяти) в терминах C ++?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Причина, по которой вы можете делать то, что вы делаете в C ++, заключается в том, что разработчик должен управлять памятью (освободить ее, когда ваша работа будет выполнена) в C ++.

Но в управляемых средах, таких как Dot Net,CLR (общеязыковая среда выполнения) позаботится об управлении памятью (когда и какую память нужно освободить, и это очень хорошо.) Для вас.

Ближайшим ответом на ваш вопрос будет создание слабых ссылок дляобъекты.так что вы можете вызывать эти ссылки всякий раз, когда это потребуется в будущем.имейте в виду, что объект, имеющий слабые ссылки, не будет собираться сборщиком мусора в обычной ситуации.Слабые ссылки используются в тех случаях, когда для создания конкретного объекта идет тяжелый процесс подъема, в таких ситуациях, чтобы избежать создания объекта с нуля, вокруг этого объекта будут создаваться слабые ссылки.перед тем, как вспомнить ваш WR, вам также необходимо проверить, существует ли объект, а не собран ли GC (в некоторых угловых ситуациях, таких как нехватка памяти.)проблема.Лучшее предложение в мире Dot Net - не заниматься управлением памятью самостоятельно и позволить GC справиться с этим.Тем не менее, есть некоторые рекомендации, которые необходимо соблюдать, чтобы облегчить жизнь GC.

Если вы хотите узнать больше об управлении памятью в Dot Net, вы можете обратиться к Под капотом .NET Memory Management

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

0 голосов
/ 23 сентября 2018

Прежде всего, вы ничего не инициализировали заново.То, что вы сделали здесь, это назначение .Вы создали новый объект MyClass и изменили состояние существующего объекта MyClass, чтобы оно совпадало с новым, вызвав его оператор присваивания.

То же самое произойдет, когда вы назначите struct в C #:

class Program
{
    static void Main(string[] args)
    {
        MyStruct mc = new MyStruct(10);

        // Will print 10
        Console.WriteLine(mc.i);
        unsafe
        {
            MyStruct* pmc = &mc;
            // Will print the address of mc
            Console.WriteLine((IntPtr)pmc);
        }

        // Assign to mc
        mc = new MyStruct(20);

        // Will print 20; mc was modified
        Console.WriteLine(mc.i);
        unsafe
        {
            MyStruct* p = &mc;
            // Will print the same address as above.
            // mc was modified in place
            // because structs have value semantics
            Console.WriteLine((IntPtr)p);
        }
    }
}

struct MyStruct
{
    public MyStruct(int i)
    {
        this.i = i;
    }
    public int i;
}
...