PDA

View Full Version : کلمه new



orangeowl
چهارشنبه 21 مرداد 1388, 17:51 عصر
سلام بر دوستان،
تو C یا CPP کلمه new چه کار میکنه ؟
جز کلمات کلیدی C هست ؟

ممنون:لبخندساده:

pswin.pooya
چهارشنبه 21 مرداد 1388, 18:11 عصر
سلام

new جزء کلمات کلیدی C++ هستش. و همون کار تابع malloc رو انجام میده.

orangeowl
چهارشنبه 21 مرداد 1388, 18:18 عصر
یعنی اینجوری ؟ :


struct point *p;
p=(struct point *)malloc(sizeof(struct point));
یا
p=new struct point

pswin.pooya
چهارشنبه 21 مرداد 1388, 18:29 عصر
دقیقا. خود کلمه new مقدار اندازه مورد نیاز رو تشخیص میده و تو مواردی که از کلاسها استفاده شده سازنده کلاس رو فراخوانی می کنه. یعنی همراه با New شدن اون سازنده کلاس هم فراخوانی میشه.

orangeowl
چهارشنبه 21 مرداد 1388, 18:39 عصر
یه error میده که

C:\Users\Desktop\add_to_linklist.c|34|error: `new' undeclared (first use in this function)|

orangeowl
چهارشنبه 21 مرداد 1388, 19:50 عصر
مثلا عبارتی که تو یه تاپیک دیگه داره بحث میشه

char **a=new char*[9]4 تا error میده
.

C:\Users\new_char.c||In function `main':|
C:\Users\new_char.c|8|error: `new' undeclared (first use in this function)|
C:\Users\new_char.c|8|error: (Each undeclared identifier is reported only once|
C:\Users\new_char.c|8|error: for each function it appears in.)|
C:\Users\new_char.c|8|error: syntax error before "char"|
||=== Build finished: 4 errors, 0 warnings ===|قبل از به کار بردن new باید کار خاصی انجام داد؟

pswin.pooya
چهارشنبه 21 مرداد 1388, 20:31 عصر
شما از چه کامپایلری استفاده میکنین؟!

Saeed_m_Farid
پنج شنبه 22 مرداد 1388, 08:18 صبح
سلام بر دوستان،
تو C یا CPP کلمه new چه کار میکنه ؟
جز کلمات کلیدی C هست ؟

ممنون:لبخندساده:
همونطوری که pswin.pooya گفتن new جزء کلمات کلیدی مختص ++C هست نه C؛ و برنامه شما که با C نوشته شده این Keyword رو نمشناسه :

4 تا error میده
.

C:\Users\new_char.c||In function `main':|
C:\Users\new_char.c|8|error: `new' undeclared (first use in this function)|
C:\Users\new_char.c|8|error: (Each undeclared identifier is reported only once|
C:\Users\new_char.c|8|error: for each function it appears in.)|
C:\Users\new_char.c|8|error: syntax error before "char"|
||=== Build finished: 4 errors, 0 warnings ===|قبل از به کار بردن new باید کار خاصی انجام داد؟
کار خاصی که باید انجام بدین، اینه که اگه قصد استفاده از امکانات ++C رو دارید، باید از این زبان استفاده کنید نه C استاندارد.

ضمناً Syntax عملگر new بصورت زیر است :

Syntax

void *operator new(std::size_t size) throw(std::bad_alloc);

void *operator new(std::size_t size, const std::nothrow_t &) throw();
void *operator new[](std::size_t size) throw(std::bad_alloc);
void *operator new[](std::size_t size, const std::nothrow_t &) throw();
void *operator new(std::size_t size, void *ptr) throw(); // Placement form

void *operator new[](std::size_t size, void *ptr) throw(); // Placement formو همونطوریکه می بینید یه Syntax کاملاً شی گرا داره که تو C استاندارد، همچین امکانی وجود نداره. این عملگر در صورتیکه بتونه به اندازه size به متغیر شما فضا اختصاص بده، اشاره گر حافظه موردنظر رو به شما برمی گردونه ولی اگه نتونه یه exception ازنوع bad_alloc در نتیجه throw می کنه ...

نکته :


دقت کنید برای متغیری که از طریق این عملگر (new) فضا اختصاص داده شده، باید برای آزادسازی حافظه از عملگر []delete استفاده کنید (البته درصورت اختصاص موفقیت آمیز حافظه)
درسته که این عملگر کاربرد مشابهی با malloc داره، ولی باید دقت کنید که درصورت عدم توانایی اختصاص حافظه این هملگر تولید exception می کنه؛ اگه نمی خواهید این اتفاق بیافته از نسخه nothrow اون باید استفاده کنید، یعنی به این صورت :
int main(int argc, char* argv[])
{
int *pn;

// nothrow version returns null pointer rather than throwing a
// bad_alloc exception.
pn = new(nothrow) int[5000000];
if(pn != NULL) {
// Allocation succeded.
}

return 0;

}

موفق باشید.