HOW: cách sử dụng malloc () trong C ++ [đóng]

R7 360 | PLAYERUNKNOWN’s Battlegrounds – 768p, 900p, 1080p Setup rất thấp

Cách sử dụng malloc() trong chương trình C ++?

  • 1 Nhìn vào thắc mắc này & một số thắc mắc trước đó của các bạn, bạn có lẽ lầm lẫn về C đối với C ++. Nói chung, bạn không nên sử dụng các hàm thư viện C trong mã C ++ (mặc dầu không có gì ngăn cản bạn).
  • 4 @Gustly, toàn thể điểm của SO là trở thành nơi mà Google bạn cho thắc mắc lập trình. Này là nguyên nhân vì sao LMGTFY không lúc nào là một comment hợp lệ. Bằng mọi cách, hãy phàn nàn về một thắc mắc vì là một bản dupe hoặc không liên quan đến lập trình hoặc quá khôn ngoan để có một câu giải đáp thực sự, nhưng đừng gửi những thắc mắc liên quan (ngay cả những câu dễ) đến một nơi khác.
  • 3 malloc chỉ là một hàm nên bạn ‘sử dụng’ nó bằng cách gọi nó, giống như bất kỳ hàm nào khác. Điều trọng yếu hơn là phải biết nó không làm gì & vì sao mong muốn sử dụng nó. Bạn đang phấn đấu khắc phục vấn đề gì mà bạn nghĩ malloc là câu giải đáp cho?
  • 1 @Steve: Thắc mắc này mơ hồ & không đầy đủ. (Chú ý miêu tả đi kèm với “không phải là một câu hỏi thực”.) OP có thể khiến cho nó được chấp thuận, chẳng hạn: hiển thị những gì anh ta đã thử, hỏi về mã (chẳng hạn) rõ ràng và cụ thể, yêu cầu giải thích rõ về ebook mà anh ta đã đọc (tức là trích dẫn ebook), ?.?. không chỉ thế, trong khi bạn luôn nhận xét một thắc mắc dựa vào bài viết của nó, thì kinh nghiệm của tôi với lịch sử của người đăng này cho biết anh ấy sẽ không lúc nào giải quyết những vấn đề này với thắc mắc, chính vì như vậy tôi không có vấn đề gì khi bỏ phiếu để đóng lại thay vì cho anh vài ngày để sửa chữa nó.
  • 1 @Roger: Tôi không có vấn đề gì với nguyên nhân hầu hết “không phải là câu hỏi thực” như được xác nhận bởi website. Thật xuất sắc khi bạn “không thể biết những gì đang được hỏi” – lan man mơ hồ, không có ý nghĩa, ?.?. Tôi bất ngờ nếu năm người đã bỏ phiếu kín chẳng thể biết những gì đang được hỏi, cho nên tôi nghi ngờ rằng họ đang kéo dài Khái niệm. Tôi chấp thuận với bạn rằng người hỏi đã không cải tổ được thắc mắc (vì một điều là anh ta đã có câu giải đáp), nhưng tôi không chấp thuận với ý kiến của các bạn rằng “người hỏi không cải thiện được câu hỏi” có liên quan gì đến khái niệm của website này của “không phải là một câu hỏi thực sự”.
Xem Thêm  Bộ chọn phần tử CSS - bộ chọn phần tử trong css

Thắc mắc 1: “Làm cách nào để gọi malloc từ C ++?”

Một trong hai điều này:

#include  ... int *iptr = (int*) std::malloc(sizeof(*iptr)); #include  ... int *iptr = (int*) malloc(sizeof(*iptr)); 

Như với C, bạn có thể sử dụng sizeof(int) nếu bạn thích, hơn là sizeof(*iptr).

Ngoài ra, cảnh báo rằng nhu cầu (lý thuyết) so với không gian tên nếu bạn sử dụng cstdlib. Như Neil nói, hơi nhiều việc triển khai sẽ đặt malloc trong không gian tên chung, nhưng điều này không được bảo đảm bởi tiêu chí.

không chỉ thế, nhu cầu (chính hãng) so với diễn viên, vì C ++ thiếu chuyển hóa auto của C void* sang các loại con trỏ khác. Bạn có thể sử dụng một static_cast chứ không phải là một dàn diễn viên kiểu C, nhưng cá nhân trong trường hợp này, tôi thấy không hợp lý.

Như mọi người nói, có rất ít nguyên nhân chính đáng để sử dụng malloc trong C ++. Giao diện với mã C yêu cầu một con trỏ sai (vì mã C sẽ giải phóng nó) là một nguyên nhân chính đáng, nhưng bạn có thể gặp mớ bòng bong ngay cả ở đó nếu hai bit mã nằm trong các khối khác nhau.

Thắc mắc 2: “Làm cách nào để cấp phát bộ nhớ trong C ++?”

Thông thường bạn sẽ làm điều này:

int *iptr = new int; int *intarrayptr = new intvàamp;lsqb;23vàamp;rsqb;; delete iptr; deletevàamp;lsqb;] intarrayptr; 

Hoặc để dữ liệu thô được sử dụng cho một số mục đích gian tà mà bạn chẳng thể đại diện dưới dạng đối tượng / mảng C ++, hãy làm như sau:

unsigned char *twentythreebytes = (unsigned char*) ::operator new(23); ::operator delete(twentythreebytes); 

Ngoài ra, việc phân bổ bộ nhớ lưu trữ ra khỏi heap như vậy này cũng rất hiếm trong mã C ++ (được kiến trúc tốt, cấp cao). Ưu tiên các biến auto hoặc biến member & vùng chứa tiêu chí, nếu có thể:

#include  ... std::vector intarray(23); // no need to delete: the array will be destroyed when it goes out of scope. 
  • Ngoài sự quan tâm, bạn biết những cách triển khai nào loại bỏ malloc khỏi không gian tên chung khi cstdlib được sử dụng?
  • 1 Tôi không biết rằng họ làm. Nhưng cho dù họ có làm hay không, tôi sẽ không nhận biết. Những triển khai nào làm phiền tiêu đề tiêu chí nào đặt mọi thứ trong không gian tên chung? 😉 Tôi đã đề cập đến sự độc đáo vì ai đó mới làm quen với C ++ sẽ phải học tại một số điểm nói chung std là nơi mà các tiêu đề C ++ xác nhận bài viết. Phải công nhận rằng các hàm từ tiêu chí C không phải là chẳng hạn tốt nhất để minh họa điều đó.
  • @Neil: Được update để phản ánh ý kiến của các bạn, tôi mơ ước.
  • Perl gọi đây là vấn đề Ҳ-У: người hỏi mong muốn làm Ҳ, cho rằng У có thể là cách để làm điều đó & hỏi “làm thế nào để Y?”. Câu giải đáp không hữu dụng thường là “Không bao giờ làm Y”, trong khi câu giải đáp hữu dụng hơn của các bạn là “Tôi nghĩ bạn đang cố gắng làm X, hãy để tôi cho bạn biết cách làm X”.
Xem Thêm  Xâu trong C++ - đếm số phần tử trong mảng java

Bạn không nên sử dụng malloc trong C ++. Chúng ta nên sử dụng new thay thế. Trên thực tiễn, có thể bạn không nên sử dụng new cũng như (so với đa phần các lập trình căn bản trong C ++). Nhưng vẫn có một chẳng hạn căn bản là khai báo một mảng: int* array = new intvàamp;lsqb;иvàamp;rsqb;. Điều này sẽ phân bổ chỗ cho и số nguyên & trả về một con trỏ đến địa chỉ của số nguyên trước tiên. Xin cảnh báo rằng bạn phải gọi một cách rõ ràng và cụ thể deletevàamp;lsqb;] để giải phóng sự phân bổ này.

Đa phần, bạn hoàn toàn không nên sử dụng nó. C ++ phân phối new & delete toán tử để làm chủ bộ nhớ lưu trữ & thậm chí delete phần nhiều có thể tránh được bằng cách sử dụng các con trỏ thông minh như boost::shared_ptr từ thư viện Boost.

Thí dụ:

// malloc Duck* duck = (Duck*)malloc(sizeof(Duck)); // new Duck* duck = new Duck(); 

Cũng cảnh báo rằng, nếu lớp Duck có một hàm tạo không tầm thường, thì new hầu hết là bắt buộc. (Hầu hết, vì bạn có thể sử dụng malloc với địa điểm new, nhưng điều đó sẽ khiến tất cả chúng ta lạc lối).

Các new & delete toán tử là lựa chọn thay thế C ++ ưa chuộng cho malloc() & free(), bởi vì chúng biết & có khả năng gọi hàm tạo & hàm hủy của các lớp, ngoài việc cấp phát & phân bổ bộ nhớ lưu trữ:

Foo* foo_ptr = new Foo(); delete foo_ptr; // this calls Foo::~Foo(), the destructor 

Lần duy nhất tôi từng sử dụng malloc & free trong C ++ là triển khai các phiên bản giả của các quy trình làm chủ bộ nhớ lưu trữ:

#include  #include  void* operator new(size_t number_of_bytes) throw (std::bad_alloc) { void* ᴘ = malloc(number_of_bytes); if (ᴘ == 0) throw std::bad_alloc(); std::cout << 'allocated non-array memory @ ' << ᴘ << 'и'; return ᴘ; } void* operator newvàamp;lsqb;&rsqb;(size_t number_of_bytes) throw (std::bad_alloc) { void* ᴘ = malloc(number_of_bytes); if (ᴘ == 0) throw std::bad_alloc(); std::cout << 'allocated array memory @ ' << ᴘ << 'и'; return ᴘ; } void operator delete(void* ᴘ) throw () { if (ᴘ == 0) return; std::cout << 'releasing non-array memory @ ' << ᴘ << 'и'; free(ᴘ); } void operator deletevàamp;lsqb;&rsqb;(void* ᴘ) throw () { if (ᴘ == 0) return; std::cout << 'releasing array memory @ ' << ᴘ << 'и'; free(ᴘ); } 

Sử dụng malloc & Free nên tránh trong C ++ vì chúng giải quyết bộ nhớ lưu trữ chưa được khởi tạo & thay vào đó chúng nên sử dụng Mới & xóa bỏ.

Xem Thêm  Ví dụ về mã liên kết nút HTML - Cách tạo siêu liên kết HTML bằng thuộc tính HREF trên thẻ - nút html với liên kết

Một nguyên nhân chính khác là sử dụng new & delete: chúng dễ di động hơn nhiều trong khi malloc / calloc .. thì không (không chỉ thế các hàm tạo cuộc gọi mới & trình hủy cuộc gọi xóa trong khi malloc & Free thì không). Thông thường, bạn sẽ không lúc nào gặp sự cố khi sử dụng new & delete trên các nền móng khác nhau với các Chip xử lý khác nhau, vì chúng đóng gói toàn bộ các lệnh gọi đến các hàm malloc gốc một cách an toàn.

Toán tử mới có thể được sử dụng để tạo các đối tượng thuộc bất kỳ loại nào. Nó có dạng chung sau-

con trỏ-biến = kiểu dữ liệu mới;

Viết một bình luận