PDA

View Full Version : new در متد سازنده چه نقشی داره ؟



am_abbas65
سه شنبه 16 مرداد 1386, 23:53 عصر
سلام
وقتی شیئی از SqlCommand و Data Adapter میسازیم من در استفاده اول از این کلاس ها به مشکل بر نمیخورم ولی در بار دوم که میخوام یک فیلد رو دوباره مقدار دهی بکنم به مشکل برمیخورم و در دستور متد سازنده new ان رو مینویسم
ObjDataset=new Dataset
خوب اگه در برنامه 100 بار یا زیاد از این کد استفاده بشه آیا حافظه به هدر میره یا وقتی ما new رو بکار میبریم آن محل حافظه clear میشه و داده های ما در آنجا قرار میگیره ؟

اگه حافظه به هدر میره یک راه حل پیشنهاد بدین و اگه نه که نظرتون رو بنویسید


در c++ اگه new رو در هنگام ایجاد کلاس نمیبردیم شاید به ارور Null Pointer Assignment بر میخوردیم

hdv212
چهارشنبه 17 مرداد 1386, 01:53 صبح
اصلا تکنولوژی و خاصیت Garbrage Collection اینه که فضای حافظه رو از متغیر هایی که بهشون ارجاع نمیشه و به نحوی بلا استفاده هستند پاک کنه، من فکر میکنم زمانی که شما new رو مجددا برای آبجکتی استفاده میکنید، مقادیر جدید جایگزین مقادیر قبلی و شی دوباره از اول ساخته میشه و در همون مکان از حافظه قرار میگیره، احتمالا ابتدا dispose شده و دوباره ازش ساخته میشه.

MH2538
چهارشنبه 17 مرداد 1386, 09:38 صبح
سلام
hdv عزیز ، اینکار garbage ایجاد نمی کند. فضای قبلی رو هم overwrite نمی کند.handle شی قبلی هم از بین نمی رود.
به تکه کدی که گذاشتم نگاه کن.
من یک شی از نوع دکمه گرفتم و 5بار اون رو new کردم و در جاهای مختلف گذاشتم و هر 5 تای اون هم قابل استفاده است.
new یک instance جدید ایجاد می کند.


namespace WhatNewDo
{
public partial class Form1 : Form
{
Button bMine;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

for (int i = 0; i <= 5; i++)
{
bMine = new Button();
bMine.Left = 10;
bMine.Top = i * 32 + 5;
this.Controls.Add(bMine);
}
}
}
}

اگر توضیحات بیشتر یا مثال خواستید من باز هم در خدمتم.

mehdi.mousavi
چهارشنبه 17 مرداد 1386, 10:02 صبح
سلام
وقتی شیئی از SqlCommand و Data Adapter میسازیم من در استفاده اول از این کلاس ها به مشکل بر نمیخورم ولی در بار دوم که میخوام یک فیلد رو دوباره مقدار دهی بکنم به مشکل برمیخورم و در دستور متد سازنده new ان رو مینویسم
ObjDataset=new Dataset
خوب اگه در برنامه 100 بار یا زیاد از این کد استفاده بشه آیا حافظه به هدر میره یا وقتی ما new رو بکار میبریم آن محل حافظه clear میشه و داده های ما در آنجا قرار میگیره ؟

اگه حافظه به هدر میره یک راه حل پیشنهاد بدین و اگه نه که نظرتون رو بنویسید

در c++ اگه new رو در هنگام ایجاد کلاس نمیبردیم شاید به ارور Null Pointer Assignment بر میخوردیم


سلام.
برای اینکه متوجه بشید که GC چگونه کار میکنه و حافظه Heap در DOT NET چطور مدیریت میشه، این پست رو بخونید. (http://barnamenevis.org/forum/showthread.php?t=74572&page=2) شما با هر بار زدن new باعث می شید تا Root مربوطه در Root Graph قرار بگیره و طبیعتا دارید فضایی رو بصورت مکرر (100 بار) اشغال می کنید... بهتره دقیقتر سوالتون رو مطرح کنید و البته مشکلی که موقع مقدار دهی فیلد بهش بر می خورید رو دقیقا توضیح بدید، تا بشه مشکل رو رفع کرد. در ضمن، منظورتون از جمله آخری که درباره CPP گفتید چی بود؟

am_abbas65
چهارشنبه 17 مرداد 1386, 10:26 صبح
در ++C وقتی که ابجکتی رو میسازید مثل زیر


class a
{
int *pointer;
....
}
a OBJA;
a OBJB;
OBJA.set();
OBJB=OBJA;
Free(OBJA);
FREE(OBJB);//NUll POINTER ASSINGMENT


OBJA در OBJB کپی BITWISE میشه .
در اینجا pointer حافظه ای رو میگیره وقتی OBJA رو ازاد میکنید پوینتر NULL میشه و به سیستم داده میشه و در بار دوم که OBJB ازاد میشه میبینه که ان قسمت از حافظه اصلا وجود نداره و در نتیجه Errore میده و میگه که همچین جایی در دست سیستم هست . در اینجاست که از new استفاده میکنیم

am_abbas65
چهارشنبه 17 مرداد 1386, 10:32 صبح
در ضمن اگه حافظه آزاد نشه باید خودمون این کار رو بکنیم و شیی رو dispose بکنیم ؟ و اگه این کارو انجام بدیم شاید دیگه در جای دیگه نتونیم از کلاس دوباره استفاده کنیم چون کلا حذف میشه. مگه #C یکی از مزیت هاش ازاد کردن حافظه به طور خودکار نیست؟

mehdi.mousavi
چهارشنبه 17 مرداد 1386, 11:03 صبح
در ++C وقتی که ابجکتی رو میسازید مثل زیر


class a
{
int *pointer;
....
}
a OBJA;
a OBJB;
OBJA.set();
OBJB=OBJA;
Free(OBJA);
FREE(OBJB);//NUll POINTER ASSINGMENT
OBJA در OBJB کپی BITWISE میشه .
در اینجا pointer حافظه ای رو میگیره وقتی OBJA رو ازاد میکنید پوینتر NULL میشه و به سیستم داده میشه و در بار دوم که OBJB ازاد میشه میبینه که ان قسمت از حافظه اصلا وجود نداره و در نتیجه Errore میده و میگه که همچین جایی در دست سیستم هست . در اینجاست که از new استفاده میکنیم

سلام.
کدی که شما نوشتید صحیح نیست. شما دو تا متغیر در Stack گرفتید، (objA, objB) و در نهایت دارید با متود free (به گمان خودتون) اونها رو به سیستم بر میگردونید! در صورتیکه متود free فضای گرفته شده از Heap رو به سیستم بر میگردونه. هر وقت اجرا از Block ای که توش objA و objB رو تعریف کردین خارج بشه، اونوقت فضا بصورت اتوماتیک به سیستم بر میگرده. متغیرهایی که تعریف می کنیم میتونن در Stack یا Heap قرار بگیرن. این دست ما هستش که تصمیم بگیریم از کدوم روش استفاده کنیم.

اما در C# بر اساس value-type یا reference-type بودن متغیر هاست که تخصیص حافظه از Stack یا Managed Heap صورت میگیره. البته استفاده از new روی هر کدوم از type های نام برده، باعث اختصاص فضا به اون متغیر از Managed Heap میشه. ضمنا، شما وقتی یه شی رو Dispose می کنید که دیگه نیازی به اون ندارید. اما Dispose شدن به معنای بر گشتن حافظه به سیستم نیست. برگشت حافظه به سیستم توسط GC و در زمان معینی (در 3 فاز) صورت میگیره. فکر میکنم اگر پستی رو که لینکش رو دادم مطالعه کنید، کاملا متوجه مساله می شید.