2013-06-13 44 views
8

tôi đã xem một số mã, sử dụng mã này là allocate. Ví dụ:sự khác biệt giữa malloc và phân bổ

char* recordDate = allocate<char>(20) 

Tôi chưa bao giờ sử dụng phân bổ trước và do đó câu hỏi, sự khác biệt giữa malloc và phân bổ là gì?

Một sự khác biệt mà tôi có thể nói, mặc dù tôi không rõ về lợi thế của nó, đó là, malloc cung cấp bộ nhớ thô, ở đó có vẻ như cấp phát sẽ cung cấp bộ nhớ thô, nhưng tôi không phải đưa con trỏ đến một loại cụ thể .

+2

Chính xác 'cấp phát' là gì? – Mehrdad

+1

@Mehrdad Nó là một phần của std. Xem std :: allocator :: phân bổ http://en.cppreference.com/w/cpp/memory/allocator/allocate –

+3

@CoryKlein Đó không phải là 'allocate <>', đó là 'std :: allocator :: allocate' (và Tôi không thể hình ảnh rằng * "mã rộng rãi bằng cách sử dụng nó" * luôn luôn là một phần của một thực hiện cấp phát, đặc biệt là ví dụ 'recordData' này. –

Trả lời

3

Từ allocate tài liệu:

Phân bổ n * sizeof(T) byte dung lượng lưu trữ chưa được khởi tạo bằng cách gọi ::operator new(std::size_t), nhưng nó là không xác định khi nào và như thế nào chức năng này được gọi là.

Ngoài ra, từ this question, bạn có thể thấy rằng newmalloc dẫn đến các kết quả khác nhau.

+1

Vậy nó khác với malloc như thế nào? –

+1

Tài liệu nào? Dường như nó diễn giải đặc tả của 'std :: allocator :: allocate', nhưng đó không phải là những gì trong câu hỏi. –

0

Khái niệm, hai chức năng này thực hiện chính xác điều tương tự. Thời gian duy nhất bạn sẽ thấy sự khác biệt là nếu bạn bắt đầu "nhìn vào bên trong của hàm" hoặc bạn hết bộ nhớ (malloc sẽ trả về NULL, kể từ allocate gọi ::new, nó sẽ ném một ngoại lệ bad_alloc).

Tôi nghĩ rằng đó là "tốt hơn C++" để sử dụng allocate (nếu không có lý do khác hơn là "Bạn không cần phải đúc allocate).

Có nói rằng, sử dụng ::new T[elements] sẽ là cách thông thường trong C++, và bên ngoài những nơi mà bạn đã vượt qua ở allocator, đây là những gì bạn nên làm.

+1

Thực sự, mẫu 'phân bổ' nào mà mọi người đang nói đến (và những người trả lời dường như được đưa ra như đã cho)? –

3

Có vẻ như sự khác biệt là với allocate bạn chỉ phải cung cấp số lượng mặt hàng bạn muốn thay vì tổng kích thước, và loại trả lại tự động được truyền cho đúng loại cho bạn.

Trong C++ bạn hầu như không bao giờ nên sử dụng một trong hai, nhưng thích new mà sẽ gọi các nhà thầu thích hợp.

Các vấn đề liên quan