ความแตกต่างระหว่างnew
/ delete
และmalloc
/ free
คืออะไร?
ที่เกี่ยวข้อง (ซ้ำกัน?): ฉันจะใช้ malloc กับ new ในกรณีใดบ้าง
ความแตกต่างระหว่างnew
/ delete
และmalloc
/ free
คืออะไร?
ที่เกี่ยวข้อง (ซ้ำกัน?): ฉันจะใช้ malloc กับ new ในกรณีใดบ้าง
คำตอบ:
ตารางเปรียบเทียบคุณสมบัติ:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
หน่วยความจำทางเทคนิคที่จัดสรรโดยใหม่มาจาก 'Free Store' ในขณะที่หน่วยความจำที่จัดสรรโดย malloc มาจาก 'Heap' ไม่ว่าทั้งสองพื้นที่จะเหมือนกันหรือไม่เป็นรายละเอียดการใช้งานซึ่งเป็นอีกเหตุผลหนึ่งที่ malloc และใหม่ไม่สามารถผสมกันได้
If ptr is NULL, no operation is performed.
new
ผู้ดำเนินการจัดสรรหน่วยความจำจากร้านค้าฟรี (หรือที่เรียกว่าหน่วยความจำแบบไดนามิกและฮีป ) มาตรฐาน C ++ 14 ส่วน 3.7.4 บนDynamic Storageกล่าวว่า "สามารถสร้างวัตถุแบบไดนามิกระหว่างการทำงานของโปรแกรม (1.9) โดยใช้นิพจน์ใหม่ (5.3.4) และทำลายโดยใช้นิพจน์ลบ"
ความแตกต่างที่เกี่ยวข้องมากที่สุดคือnew
ผู้ประกอบการจัดสรรหน่วยความจำจากนั้นเรียกตัวสร้างและdelete
เรียก destructor แล้วจัดสรรหน่วยความจำ
new
เรียก ctor ของวัตถุdelete
เรียก dtor
malloc
& free
จัดสรรและปล่อยหน่วยความจำดิบ
new
/ delete
คือ C ++, malloc
/ free
มาจาก C เก่าที่ดี
ใน C ++ new
เรียกใช้ตัวสร้างวัตถุและdelete
เรียก destructor
malloc
และfree
มาจากยุคมืดก่อน OO เท่านั้นจัดสรรและเพิ่มหน่วยความจำโดยไม่ต้องใช้รหัสของวัตถุใด ๆ
ใน C ++ new
/ delete
เรียก Constructor / Destructor ตามลำดับ
malloc
/ free
เพียงจัดสรรหน่วยความจำจากฮีป new
/ delete
จัดสรรหน่วยความจำเช่นกัน
ความคล้ายคลึงกันเพียงอย่างเดียวคือmalloc
/ new
ทั้งคู่ส่งคืนตัวชี้ซึ่งระบุถึงหน่วยความจำบางส่วนบนฮีปและทั้งคู่รับประกันว่าเมื่อมีการส่งคืนบล็อกหน่วยความจำดังกล่าวแล้วจะไม่ถูกส่งคืนอีกเว้นแต่คุณจะว่าง / ลบก่อน นั่นคือพวกเขาทั้งสอง "จัดสรร" หน่วยความจำ
อย่างไรก็ตามnew
/ delete
ทำงานโดยพลการอื่นนอกจากนี้ผ่านทางตัวสร้าง destructors และตัวดำเนินการมากเกินไป malloc
/ free
เท่านั้นที่เคยจัดสรรและเพิ่มหน่วยความจำ
ในความเป็นจริงnew
สามารถปรับแต่งได้อย่างเพียงพอซึ่งไม่จำเป็นต้องส่งคืนหน่วยความจำจากฮีปหรือแม้แต่จัดสรรหน่วยความจำเลย อย่างไรก็ตามค่าเริ่มต้นnew
ไม่
ความแตกต่างที่สำคัญระหว่าง new และ malloc ก็คือ new จะเรียกใช้ตัวสร้างของวัตถุและการเรียกที่สอดคล้องกันเพื่อลบ invokes destructor ของวัตถุ
มีความแตกต่างอื่น ๆ :
new
เป็นประเภทที่ปลอดภัยmalloc
ส่งกลับวัตถุประเภทvoid*
new
โยนข้อยกเว้นในข้อผิดพลาดmalloc
ผลตอบแทนNULL
และการตั้งค่า errno
new
เป็นโอเปอเรเตอร์และสามารถโอเวอร์โหลดmalloc
ได้เป็นฟังก์ชั่นและไม่สามารถโอเวอร์โหลดได้
new[]
ซึ่งจัดสรรอาเรย์นั้นง่ายกว่าและปลอดภัยกว่าประเภทอื่น ๆ malloc
malloc
- การปันส่วนที่ได้รับมาสามารถปรับขนาดผ่านrealloc
- การnew
ปันส่วนที่ได้รับไม่สามารถปรับขนาดได้
malloc
สามารถจัดสรรหน่วยความจำแบบ N-byte ได้, new
ต้องทำการจัดสรรอาเรย์, char
ประเภท, ประเภท
เมื่อดูที่ความแตกต่างสรุปคือ malloc คือ C-esque ใหม่คือ C ++ - esque ใช้อันที่เหมาะกับฐานรหัสของคุณ
แม้ว่ามันจะถูกกฎหมายสำหรับใหม่และ malloc ที่จะดำเนินการโดยใช้อัลกอริทึมการจัดสรรหน่วยความจำที่แตกต่างกันในระบบใหม่ส่วนใหญ่จะดำเนินการภายในโดยใช้ malloc ทำให้ไม่มีความแตกต่างในระดับระบบ
มีบางสิ่งที่new
ทำmalloc
ไม่ได้:
new
สร้างวัตถุโดยการเรียกตัวสร้างของวัตถุนั้นnew
ไม่จำเป็นต้องพิมพ์หน่วยความจำที่จัดสรรดังนั้นถ้าคุณใช้malloc
คุณต้องทำสิ่งต่าง ๆ อย่างชัดเจนซึ่งไม่สามารถนำไปใช้ได้จริงเสมอไป นอกจากนี้new
สามารถโอเวอร์โหลดได้ แต่malloc
ไม่สามารถ
ในคำถ้าคุณใช้ C ++ ลองใช้new
ให้มากที่สุด
นอกจากนี้ยังมี
ใหม่ทั่วโลกและลบสามารถแทนที่, malloc / ฟรีไม่สามารถ
เพิ่มเติมใหม่และลบสามารถแทนที่ต่อประเภท
new
และdelete
เป็น C + + แบบดั้งเดิมซึ่งประกาศอินสแตนซ์ใหม่ของคลาสหรือลบมัน (เช่นการเรียกใช้ destructor ของคลาสสำหรับอินสแตนซ์)
malloc
และfree
เป็นฟังก์ชั่น C และจะจัดสรรและเพิ่มบล็อกหน่วยความจำ (ขนาด)
ทั้งสองใช้ฮีปเพื่อทำการจัดสรร malloc
และfree
ยังคง "ระดับต่ำ" มากขึ้นตามที่พวกเขาเพียงแค่สำรองพื้นที่หน่วยความจำซึ่งอาจจะเกี่ยวข้องกับตัวชี้ ไม่มีโครงสร้างใดถูกสร้างขึ้นรอบ ๆ หน่วยความจำนั้น (เว้นแต่คุณจะถือว่าอาร์เรย์ C เป็นโครงสร้าง)
ใหม่และลบเป็นตัวดำเนินการใน c ++; ซึ่งสามารถโอเวอร์โหลดได้เช่นกัน malloc และ free เป็นฟังก์ชันใน c;
malloc ส่งคืน null ptr เมื่อล้มเหลวในขณะที่มีข้อผิดพลาดเกิดขึ้นใหม่
ที่อยู่ที่ถูกส่งกลับโดย malloc ต้องตามประเภท casted อีกครั้งเนื่องจากส่งคืน (void *) malloc (ขนาด) ใหม่ส่งคืนตัวชี้ที่พิมพ์
malloc()
เราต้องรวม <stdlib.h>
หรือ
ในโปรแกรมที่ไม่จำเป็นสำหรับ<alloc.h>
new
new
และdelete
สามารถโอเวอร์โหลดได้ แต่malloc
ไม่สามารถทำได้new
ที่เราสามารถส่งอยู่ที่เราต้องการที่จะจัดสรรหน่วยความจำ malloc
แต่เรื่องนี้เป็นไปไม่ได้ในกรณีของalloc.h
ไม่ใช่ส่วนหัวมาตรฐาน <new>
จำเป็นต้องใช้ตำแหน่งใหม่
รหัสนี้ใช้สำหรับลบคำสำคัญหรือฟังก์ชั่นฟรี แต่เมื่อสร้างวัตถุตัวชี้โดยใช้ 'malloc' หรือ 'ใหม่' และ deallocate หน่วยความจำวัตถุโดยใช้การลบแม้ตัวชี้วัตถุที่สามารถเรียกใช้ฟังก์ชั่นในชั้นเรียน หลังจากนั้นใช้ฟรีแทนการลบแล้วมันยังทำงานหลังจากคำสั่งฟรี แต่เมื่อใช้ทั้งสองแล้ววัตถุตัวชี้เท่านั้นที่ไม่สามารถเรียกใช้ฟังก์ชั่นในระดับ .. รหัสมีดังนี้:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
ผลลัพธ์:
Hello Hi 0x2abfef37cc20
1. syntex ใหม่นั้นง่ายกว่า malloc ()
2.new/delete เป็นโอเปอเรเตอร์ที่ malloc () / free () เป็นฟังก์ชั่น
3.new/delete รันเร็วกว่า malloc () / free () เนื่องจากโค้ด assemly ใหม่วางโดยตรงโดยคอมไพเลอร์
4. เราสามารถเปลี่ยนใหม่ / ลบความหมายในโปรแกรมด้วยความช่วยเหลือของผู้ประกอบการที่ทับซ้อนกัน