powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Высвобождение ресурсов
33 сообщений из 33, показаны все 2 страниц
Высвобождение ресурсов
    #32421333
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим я создаю переменную и потом присваиваю значение null
Код: plaintext
1.
2.
HelloWorld hw1 = new HelloWolrd();
hw1 = null;


Насколько я понимаю, поскольку ссылок больше нет, то память должна с помощью GC высвобождаться?

Я хочу что-бы это произошло немедленно, сразу после hw1 = null;
И что-бы при этом отработал какой-либо метод класса HelloWolrd в котором я могу произвести дополнительные операции.
Что мне нужно сделать?
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32421364
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще говоря никак - так как GC-процес недетерминирован

Ежели ваш объект держит какие-то ресурсы которые хочется освободить как можно скорее - то см IDisposable
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32421378
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32421545
Полуэкт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не вдаваться в подробности:

o.Dispose();
GC.Collect();

но вообще такие вопросы обычно от неправильного планирования возникают. у меня например все вопросы которые я задал тут - все от того что толком ни кто не знают что мы делаем. если бы был нормальный менеджер проекта и команда заточенная именно под разработку хорошо спроектированного продукта то вопросов бы не было. а у нас что не мэн - то звезда. причем небывалой величины :)
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32421600
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я рассматриваю такую задачу: есть класс, при создании нового обьекта счётчик увеличивается, при уничтожении обьектов - счётчик уменьшается.
Допустим я пишу данный класс для стороннего использования и должен быть уверен, что как только все ссылки утеряны на переменную, обьект уничтожается и счётчик уменьшается. Исходим из того, что заставить сторонних разработчиков выполнять какой либо специальный метод у обьекта класса или использовать using () - невозможно. Единственно, за что можно зацепиться, когда реально происходит высвобождение срабатывает метод финализации, в котором счётчик уменьшается.

Практика показала, что hw1 = null не приводит к срабатыванию ни ~MyClass ни к срабатывнию Dispose при реализации интерфейса IDispose;
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32422578
Петрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это тебе поможет: Как писать деструкторы класса?
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32422764
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал, толково.

Однако про null ничего там нет.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32422828
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ms-help://MS.NETFrameworkSDKv1.1/cpref/html/frlrfSystemIDisposableClassTopic.htm

там очень ясно написано когда вызываются Finalize() и Dispose()
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32423225
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно не хватает детерминированного деструктора. Нет единого виртуального метода для разрушения любого объекта, как например Free или Destroy в дельфи, и это очень огорчает.
Внутри Finalize некоторые методы объектов уже нельзя использовать - я на этот скрипучий пень уже налетел.
А еще крайне недостает виртуальных конструкторов. Вот.
А еще в наследнике нельзя при переопределении виртуального метода нельзя изменить зону видимости protected -> public, и это странное ограничение старого дельфиста весьма озадачивает.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32423250
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dankov
Все равно не хватает детерминированного деструктора.

Угу - это главная проблема GC - и в .Net и в Java. А вот в том же Power Builder - объекты можно удалять и принудительно и автоматически!

А еще крайне недостает виртуальных конструкторов.
деструкторов наверно :)
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32423534
Фотография SergLet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D C# нет такого понятия как в классическом С++! Здесь работает сборщик мусора!
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32423692
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА еще крайне недостает виртуальных конструкторов.
деструкторов наверно :)

Нет, именно конструкторов. Компонентная модель в дельфи стала невероятно удачной только в силу того факта, что не нужно было в каждом наследнике заново пересоздавать конструктор Create с параметром aOwner. А в C# нет возможности автоматом унаследовать параметризованный конструктор. И уже в силу этого компонентная модель сложнее.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32423702
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторD C# нет такого понятия как в классическом С++! Здесь работает сборщик мусора!

Да пусть себе работает, кто ему мешает. Это с возможностью иметь детерминированные деструкторов - перпендикулярно!

Ресурсы как правило ограничены. Это и хендлы, и количество коннектов, и банально память. И вполне может быть, что ресурс закончится быстрее, чем приложение дождется пока GC придет с лопатой. В этом случае сильно бы помогло наличие детерминированного деструктора. А GC пущай освобождает то, что программист сам не прибил. Не вижу препядствий.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32423726
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА в C# нет возможности автоматом унаследовать параметризованный конструктор.

Чего, правда что-ли? Сам пока не проверял. В Java это точно есть. Какая причина не делать это в C# - непонятна.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32423920
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В C# так же как и в C++ конструкторы а также оператор присваивания не наследуются
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424035
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ C# так же как и в C++ конструкторы а также оператор присваивания не наследуются

Вот C++ не надо вспоминать, а то сейчас стошнит. C# - синтетический язык, вобравший типа все лучшее из 15-ти языков после многолетних исследований с затратами под млрд президентов. Что не мешает удивляться некоторым очевидным недостаткам.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424127
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Dankov:

Я читал что от C,C++,Java,Pascal, Biasic. А какие еще языки?
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424129
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dankov

Вот C++ не надо вспоминать, а то сейчас стошнит
При всем уважении - не на те вещи у вас аллергия. Эти ограничения в С++ и в C# появились не случайно - а как раз в результате "многолетних исследований с затратами под млрд президентов"

P.S> softbuilder@inbox.ru а вы уверены что в Java не тоже самое - а то я с ней не знаком
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424186
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to funikovyuri:

Возможно я не прав. Попробую уточнить.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424212
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, признаю ошибочность своего утверждения.
Возможен только вызов конструктора супер-класса.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public class MyClass2 extends MyClass1
{
 public MyClass2(String pHi)
 {
  super(pHi);
 }
}


Так как конструктор не наследуется.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424256
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь главный вопрос - а в Delphi - конструкторы наследуются? точно?
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424308
Петрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, по-моему, вы гоните!

В C# конструкторы наследуются:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class BaseClass
{
  public BaseClass()
  {
    //инициализируем поля базового класса
  }
}

public class InheritClass: BaseClass
{
  public InheritClass()
     :base()  //Если нужно, то инициализируем поля родительского класса
  {
     //Инициализируем поля унаследованного класса
  }
}
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424327
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не, Петрович, это вы неправильно понимаете что значит "наследуется" - а значит что в случае наследования конструкторов будет компилиться такой пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class base
{
public:
     base(int a){}
};
class derived: public base
{
public:
};

void main(void)
{
   derived drv = new derived( 10 );
}
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424787
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА теперь главный вопрос - а в Delphi - конструкторы наследуются? точно?

Совершенно точно. С первых дней существования дельфи.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32424844
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда это даже чуть чуть странно - с одной стороны C++,Java,C# - с другой Delphi. Причем автор у Delphi и C# один и тот же :)

Ok - будет время я покопаю в этом направлении - интересно чем Хейлсберг руководствовался при написании Object Pascal.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32425014
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А за каким таким мне надо наследовать конструктор базового класса в C++? Он (его default разновидность) неявно вызывается при попытке создания инстанса производного класса, хотя вы можете делать это и явно. Поэтому логика такая - базовый класс инициализирует protected members, а производный класс наследует их, а не весь конструктор целиком, что есть глубоко правильно. Так что с точки зрения ANSI C++ код

class base
{
public:
base(int a){}
};
class derived: public base
{
public:
};

void main(void)
{
derived drv = new derived(10);
}

таки должен компилиться, если его переписать так (нормальный default constructor)

class base
{
int secret;
public:
base(int a = 10){}
};

base::base(int a)
{
secret = a;
}

class derived: public base
{
public:
};

void main(void)
{
derived drv();
}

а derived() компайлер сам напишет за Вас.

Теперь всем адептам RAD средств (C#, Java, Delphi, etc..), особенно тем из них, кого тошнит от C++ - не путайте божий дар с яичницей. C/C++ - это то, на чём пишут ОС (UNIX, Windows), драйвера устройств, сервера баз данных, серьёзную матеатику и проч. Да, это pain in the ass, писать GUI даже на SDK без MFC поддержки. Ну так и пишите себе на здоровье, хоть на C#, хоть на VB.Net, хоть на Delphi, но не трогайте своими GUIшными руками святого.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32425710
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА за каким таким мне надо наследовать конструктор базового класса в C++?

Один минус в ненаследовании конструкторов (как мне кажется) , попробую рассуждать логически: если конструктор не наследуется, значит не наследуется программный код этого конструктора. В таком случае, все производные классы нуждаются в коде родителя, иначе нельзя будет скомпилить(выполнить) код потомка, т.е. код потомка несамодостаточен. Значит всегда нужно за собой "таскать" код родителя.

Поэтому, если в Delphi конструктор наследуется, действительно ли можно обойтись без базового класса?

Какие есть мысли по этому поводу?
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32425774
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softbuilder@inbox.ru

Это какой код предка надо переновить в потомка? Ничего переносить не надо - вот такой код будет работать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class base 
{ 
public: 
base(int a){} 
}; 
class derived: public base 
{ 
public: 
   derived(int a): base(a){}
}; 

void main(void) 
{ 
derived drv = new derived( 10 ); 
} 
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32425799
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел ввиду двоичный код, который при компиляции получается.

В твоём примере, если всё будет находится в одной DLL - понятно что будет всё работать.

Представь, что у тебя есть DLL c кодом родителя, ты компилишь DLL с кодом потомка, указав связь с DLL родителя. Всё нормально компилится. Теперь DLL родителя удаляем. Далее ты пишешь программу где создаёшь экземпляр потомка. Что получаем? Так как конструктор не наследуется и DLL родителя нет, что произойдет при вызовк base()? Подозреваю, что ошибка. Вот об этом и речь.

А в случае Delphi, как я понимаю этого не произойдёт.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32425910
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет - это произойдет в любом случае - ни фига себе - убить код предка и ожидать нормальной работы!! Наследование - это же не copy&paste
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32426015
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот-вот. Поэтому интересно, в Delphi также? Если в Delphi также, то какой прок от наследования конструкторов, непонятно.
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32426186
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то какой прок от наследования конструкторов

По-мойму, это типично RAD-овская "фича"... (чтобы "пальцами меньше по клаве стучать"), вспомните VFP, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DEFINE CLASS myBase AS CUSTOM
	
	PROCEDURE Init
		* Any difficult initialization tasks...
	ENDPROC

ENDDEF

DEFINE CLASS myInheritance AS myBase
	
	* PROCEDURE Init
		* Any difficult initialization tasks...
	* ENDPROC
	* It's implied to be done by itself...

	PROCEDURE SomeWhatElse
		* Another difficult tasks...
	ENDPROC

ENDDEF


А при создании С#, соответственно, не "пошли на поводу" у человеческой лени, а решили сделать код более "структурированным" и "организованным" (ИМХО).
...
Рейтинг: 0 / 0
Высвобождение ресурсов
    #32426896
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Солидарен с funikovjuri - если бинарный код предка недоступен, обязательно произойдёт ошибка или на этапе линкирования (в лучшем случае) или на этапе выполнения. Чудес не бывает...
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Высвобождение ресурсов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]