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

В 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 ++?

0

Решение

Прежде всего, вы ничего не инициализировали заново. То, что вы сделали здесь, назначение. Вы создали новый 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;
}
1

Другие решения

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

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

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

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

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

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

1