Cách các loại dữ liệu được lưu trữ trong bộ nhớ trong python?
Quản lý bộ nhớ trong Python liên quan đến một đống riêng chứa tất cả các đối tượng Python và cấu trúc dữ liệu. Việc quản lý vùng riêng tư này được đảm bảo nội bộ bởi trình quản lý bộ nhớ Python. Trình quản lý bộ nhớ Python có các thành phần khác nhau xử lý các khía cạnh quản lý lưu trữ động khác nhau, như chia sẻ, phân đoạn, phân bổ trước hoặc bộ nhớ đệm Show
Ở mức thấp nhất, bộ cấp phát bộ nhớ thô đảm bảo rằng có đủ chỗ trong vùng riêng tư để lưu trữ tất cả dữ liệu liên quan đến Python bằng cách tương tác với trình quản lý bộ nhớ của hệ điều hành. Ngoài bộ cấp phát bộ nhớ thô, một số bộ cấp phát dành riêng cho đối tượng hoạt động trên cùng một vùng nhớ và thực hiện các chính sách quản lý bộ nhớ riêng biệt phù hợp với đặc thù của từng loại đối tượng. Ví dụ: các đối tượng số nguyên được quản lý khác nhau trong heap so với chuỗi, bộ dữ liệu hoặc từ điển vì số nguyên bao hàm các yêu cầu lưu trữ khác nhau và sự đánh đổi giữa tốc độ/không gian. Do đó, trình quản lý bộ nhớ Python ủy thác một số công việc cho bộ cấp phát dành riêng cho đối tượng, nhưng đảm bảo rằng bộ cấp phát sau hoạt động trong giới hạn của vùng riêng tư Điều quan trọng là phải hiểu rằng việc quản lý heap Python được thực hiện bởi chính trình thông dịch và người dùng không có quyền kiểm soát nó, ngay cả khi họ thường xuyên thao tác các con trỏ đối tượng tới các khối bộ nhớ bên trong heap đó. Việc phân bổ không gian heap cho các đối tượng Python và các bộ đệm bên trong khác được trình quản lý bộ nhớ Python thực hiện theo yêu cầu thông qua các hàm API Python/C được liệt kê trong tài liệu này Để tránh hỏng bộ nhớ, người viết tiện ích mở rộng không bao giờ được thử thao tác trên các đối tượng Python bằng các hàm do thư viện C xuất ra. PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;57, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;58, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;59 và PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;60. Điều này sẽ dẫn đến các cuộc gọi hỗn hợp giữa trình cấp phát C và trình quản lý bộ nhớ Python với hậu quả nghiêm trọng, bởi vì chúng triển khai các thuật toán khác nhau và hoạt động trên các vùng khác nhau. Tuy nhiên, người ta có thể cấp phát và giải phóng các khối bộ nhớ một cách an toàn bằng bộ cấp phát thư viện C cho các mục đích riêng lẻ, như minh họa trong ví dụ sau PyObject *res; char *buf = (char *) malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); ...Do some I/O operation involving buf... res = PyBytes_FromString(buf); free(buf); /* malloc'ed */ return res; Trong ví dụ này, yêu cầu bộ nhớ cho bộ đệm I/O được xử lý bởi bộ cấp phát thư viện C. Kết quả là trình quản lý bộ nhớ Python chỉ liên quan đến việc phân bổ đối tượng byte được trả về Tuy nhiên, trong hầu hết các trường hợp, nên phân bổ bộ nhớ cụ thể từ heap Python vì heap nằm dưới sự kiểm soát của trình quản lý bộ nhớ Python. Ví dụ: điều này là bắt buộc khi trình thông dịch được mở rộng với các loại đối tượng mới được viết bằng C. Một lý do khác để sử dụng heap Python là mong muốn thông báo cho trình quản lý bộ nhớ Python về nhu cầu bộ nhớ của mô-đun mở rộng. Ngay cả khi bộ nhớ được yêu cầu được sử dụng riêng cho các mục đích nội bộ, có tính đặc biệt cao, việc ủy quyền tất cả các yêu cầu bộ nhớ cho trình quản lý bộ nhớ Python sẽ khiến trình thông dịch có hình ảnh chính xác hơn về toàn bộ dung lượng bộ nhớ của nó. Do đó, trong một số trường hợp nhất định, trình quản lý bộ nhớ Python có thể kích hoạt hoặc không kích hoạt các hành động thích hợp, như thu gom rác, nén bộ nhớ hoặc các quy trình phòng ngừa khác. Lưu ý rằng bằng cách sử dụng bộ cấp phát thư viện C như trong ví dụ trước, bộ nhớ được cấp phát cho bộ đệm I/O thoát hoàn toàn khỏi trình quản lý bộ nhớ Python Xem thêm Biến môi trường PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;61 có thể được sử dụng để định cấu hình bộ cấp phát bộ nhớ được sử dụng bởi Python Biến môi trường PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;62 có thể được sử dụng để in số liệu thống kê của bộ cấp phát bộ nhớ pymalloc mỗi khi đấu trường đối tượng pymalloc mới được tạo và bật . Tên miền cấp phát¶Tất cả các chức năng phân bổ thuộc về một trong ba “miền” khác nhau (xem thêm PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;0). Các miền này đại diện cho các chiến lược phân bổ khác nhau và được tối ưu hóa cho các mục đích khác nhau. Chi tiết cụ thể về cách mọi miền phân bổ bộ nhớ hoặc chức năng nội bộ mà mỗi miền gọi được coi là chi tiết triển khai, nhưng với mục đích gỡ lỗi, bạn có thể tìm thấy bảng đơn giản hóa tại tại đây. There is no hard requirement to use the memory returned by the allocation functions belonging to a given domain for only the purposes hinted by that domain (although this is the recommended practice). For example, one could use the memory returned by PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;1 for allocating Python objects or the memory returned by PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;2 for allocating memory for buffers. Ba miền phân bổ là
Khi giải phóng bộ nhớ được cấp phát trước đó bởi các chức năng cấp phát thuộc một miền nhất định, phải sử dụng các chức năng cấp phát cụ thể phù hợp. Ví dụ: PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;3 phải được sử dụng để giải phóng bộ nhớ được cấp phát bằng cách sử dụng PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;4 Giao diện bộ nhớ thô¶Các bộ chức năng sau là trình bao bọc cho bộ cấp phát hệ thống. Các hàm này an toàn cho luồng, không cần giữ GIL . Bộ bộ cấp phát bộ nhớ thô mặc định sử dụng các chức năng sau. PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;57, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;58, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;59 và PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;60; . Mới trong phiên bản 3. 4 void *PyMem_RawMalloc(size_t n)¶Allocates n bytes and returns a pointer of type void* to the allocated memory, or PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1 if the request fails. Yêu cầu các byte bằng 0 trả về một con trỏ không phải ______71 khác biệt nếu có thể, như thể thay vào đó, _____73 đã được gọi. Bộ nhớ sẽ không được khởi tạo theo bất kỳ cách nào void *PyMem_RawCalloc(size_t nelem, size_t elsize)¶Allocates nelem elements each whose size in bytes is elsize and returns a pointer of type void* to the allocated memory, or PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1 if the request fails. The memory is initialized to zeros. Yêu cầu các phần tử bằng 0 hoặc các phần tử có kích thước byte bằng 0 trả về một con trỏ không phải ______71 riêng biệt nếu có thể, như thể thay vào đó, PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;6 đã được gọi Mới trong phiên bản 3. 5 void *PyMem_RawRealloc(void *p, size_t n)¶Resizes the memory block pointed to by p to n bytes. The contents will be unchanged to the minimum of the old and the new sizes. Nếu p là PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1, cuộc gọi tương đương với PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;8; Trừ khi p là PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1, nó phải được trả lại bởi một cuộc gọi trước tới PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;1, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;92 hoặc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;93 Nếu yêu cầu không thành công, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;92 trả về PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1 và p vẫn là một con trỏ hợp lệ tới vùng bộ nhớ trước đóvoid PyMem_RawFree(void *p)¶ Frees the memory block pointed to by p, which must have been returned by a previous call to PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;1, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;92 or PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;93. Otherwise, or if PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;99 has been called before, undefined behavior occurs. Nếu p là PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1, không có thao tác nào được thực hiện Giao diện bộ nhớ¶Các bộ chức năng sau đây, được lập mô hình theo tiêu chuẩn ANSI C, nhưng chỉ định hành vi khi yêu cầu byte bằng 0, có sẵn để cấp phát và giải phóng bộ nhớ khỏi heap Python Trình bộ cấp phát bộ nhớ mặc định sử dụng bộ cấp phát bộ nhớ pymalloc . Cảnh báo Phải giữ GIL khi sử dụng các chức năng này. Đã thay đổi trong phiên bản 3. 6. Bộ cấp phát mặc định hiện là pymalloc thay vì hệ thống PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;57. void *PyMem_Malloc(size_t n)¶ Part of the Stable ABI. Cấp phát n byte và trả về một con trỏ loại void* cho bộ nhớ được cấp phát hoặc PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1 . Yêu cầu các byte bằng 0 trả về một con trỏ không phải ______71 khác biệt nếu có thể, như thể thay vào đó, _____1574 đã được gọi. Bộ nhớ sẽ không được khởi tạo theo bất kỳ cách nào void *PyMem_Calloc(size_t nelem, size_t elsize)¶Part of the Stable ABI since version 3.7. Cấp phát các phần tử nelem, mỗi phần tử có kích thước theo byte là elsize và trả về một con trỏ loại void* . Bộ nhớ được khởi tạo bằng không. Yêu cầu các phần tử bằng 0 hoặc các phần tử có kích thước byte bằng 0 trả về một con trỏ không phải ______71 riêng biệt nếu có thể, như thể thay vào đó, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;577 đã được gọi Mới trong phiên bản 3. 5 void *PyMem_Realloc(void *p, size_t n)¶Part of the Stable ABI. Thay đổi kích thước khối bộ nhớ được trỏ tới bởi p thành n byte. Nội dung sẽ không thay đổi ở mức tối thiểu của kích thước cũ và mới Nếu p là PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1, cuộc gọi tương đương với PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;579; Trừ khi p là PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1, nó phải được trả lại bởi một cuộc gọi trước tới PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;4, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;583 hoặc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;584 Nếu yêu cầu không thành công, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;583 trả về PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1 và p vẫn là một con trỏ hợp lệ tới vùng bộ nhớ trước đóvoid PyMem_Free(void *p)¶ Part of the Stable ABI. Giải phóng khối bộ nhớ được trỏ tới bởi p, khối này phải được trả về bởi lệnh gọi trước đó tới PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;4, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;583 hoặc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;584. Mặt khác, hoặc nếu PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;590 đã được gọi trước đó, hành vi không xác định sẽ xảy ra Nếu p là PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1, không có thao tác nào được thực hiện Các macro hướng loại sau đây được cung cấp để thuận tiện. Lưu ý rằng LOẠI đề cập đến bất kỳ loại C nào LOẠI *PyMem_New(LOẠI, size_t n)¶Same as PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;4, but allocates PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;593 bytes of memory. Returns a pointer cast to TYPE* . Bộ nhớ sẽ không được khởi tạo theo bất kỳ cách nào. LOẠI *PyMem_Resize(void *p, TYPE, size_t n)¶ Same as PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;583, but the memory block is resized to PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;593 bytes. Returns a pointer cast to TYPE* . Khi quay lại, p sẽ là một con trỏ tới vùng bộ nhớ mới hoặc PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1 trong trường hợp thất bại. Đây là macro tiền xử lý C; . Lưu giá trị ban đầu của p để tránh mất bộ nhớ khi xử lý lỗi void PyMem_Del(void *p)¶Same as PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;3. Ngoài ra, các bộ macro sau được cung cấp để gọi trực tiếp bộ cấp phát bộ nhớ Python mà không liên quan đến các hàm API C được liệt kê ở trên. Tuy nhiên, lưu ý rằng việc sử dụng chúng không duy trì khả năng tương thích nhị phân trên các phiên bản Python và do đó không được dùng trong các mô-đun mở rộng
Cấp phát đối tượng¶Các bộ chức năng sau đây, được lập mô hình theo tiêu chuẩn ANSI C, nhưng chỉ định hành vi khi yêu cầu byte bằng 0, có sẵn để cấp phát và giải phóng bộ nhớ khỏi heap Python Ghi chú Không đảm bảo rằng bộ nhớ do các bộ cấp phát này trả về có thể được truyền thành công tới một đối tượng Python khi chặn các hàm cấp phát trong miền này bằng các phương pháp được mô tả trong Tùy chỉnh bộ cấp phát bộ nhớ . section. Trình bộ cấp phát đối tượng mặc định sử dụng bộ cấp phát bộ nhớ pymalloc . Cảnh báo Phải giữ GIL khi sử dụng các chức năng này. void *PyObject_Malloc(size_t n)¶Part of the Stable ABI. Cấp phát n byte và trả về một con trỏ loại void* cho bộ nhớ được cấp phát hoặc PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1 . Yêu cầu các byte bằng 0 trả về một con trỏ không phải ______71 khác biệt nếu có thể, như thể thay vào đó, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;606 đã được gọi. Bộ nhớ sẽ không được khởi tạo theo bất kỳ cách nàovoid *PyObject_Calloc(size_t nelem, size_t elsize)¶ Part of the Stable ABI since version 3.7. Cấp phát các phần tử nelem, mỗi phần tử có kích thước theo byte là elsize và trả về một con trỏ loại void* . Bộ nhớ được khởi tạo bằng không. Yêu cầu các phần tử bằng 0 hoặc các phần tử có kích thước byte bằng 0 trả về một con trỏ không phải PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1 riêng biệt nếu có thể, như thể thay vào đó, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;609 đã được gọi Mới trong phiên bản 3. 5 void *PyObject_Realloc(void *p, size_t n)¶Part of the Stable ABI. Thay đổi kích thước khối bộ nhớ được trỏ tới bởi p thành n byte. Nội dung sẽ không thay đổi ở mức tối thiểu của kích thước cũ và mới Nếu p là PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1, cuộc gọi tương đương với PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;611; Trừ khi p là PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1, nó phải được trả lại bởi một cuộc gọi trước tới PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;2, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;615 hoặc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;616 Nếu yêu cầu không thành công, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;615 trả về PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1 và p vẫn là một con trỏ hợp lệ tới vùng bộ nhớ trước đóvoid PyObject_Free(void *p)¶ Part of the Stable ABI. Giải phóng khối bộ nhớ được trỏ tới bởi p, khối này phải được trả về bởi lệnh gọi trước đó tới PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;2, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;615 hoặc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;616. Mặt khác, hoặc nếu PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;622 đã được gọi trước đó, hành vi không xác định sẽ xảy ra Nếu p là PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;1, không có thao tác nào được thực hiện Bộ cấp phát bộ nhớ mặc định¶Bộ cấp phát bộ nhớ mặc định Cấu hình Tên PyMem_RawMalloc PyMem_Malloc PyObject_Malloc Phát hành bản dựng PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;624 PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;625 PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;626 PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;626 bản dựng gỡ lỗi PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;628 PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;625 + gỡ lỗi PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;626 + gỡ lỗi PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;626 + gỡ lỗi Phát hành bản dựng, không có pymalloc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;02 PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;625 PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;625 PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;625 Bản dựng gỡ lỗi, không có pymalloc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;06 PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;625 + gỡ lỗi PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;625 + gỡ lỗi PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;625 + gỡ lỗi Truyền thuyết
Tùy chỉnh cấp phát bộ nhớ¶Mới trong phiên bản 3. 4 type PyMemAllocatorEx ¶Cấu trúc được sử dụng để mô tả bộ cấp phát khối bộ nhớ. Cấu trúc có các trường sau. Đồng ruộng Nghĩa PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;17 ngữ cảnh người dùng được chuyển làm đối số đầu tiên PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;18 phân bổ một khối bộ nhớ PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;19 phân bổ một khối bộ nhớ được khởi tạo bằng số không PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;20 phân bổ hoặc thay đổi kích thước khối bộ nhớ PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;21 giải phóng một khối bộ nhớ Đã thay đổi trong phiên bản 3. 5. Cấu trúc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;22 đã được đổi tên thành PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;23 và một trường PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;24 mới đã được thêm vào. type PyMemAllocatorDomain ¶ Enum được sử dụng để xác định miền cấp phát. tên miền. PYMEM_DOMAIN_RAW ¶Hàm.
Hàm.
Hàm.
Get the memory block allocator of the specified domain. void PyMem_SetAllocator(PyMemAllocatorDomain miền, PyMemAllocatorEx *allocator)¶Set the memory block allocator of the specified domain. Bộ cấp phát mới phải trả về một con trỏ không phải ____71 riêng biệt khi yêu cầu byte bằng 0 Đối với miền PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;38, bộ cấp phát phải an toàn theo luồng. GIL không được giữ khi cấp phát được gọi. Nếu bộ cấp phát mới không phải là hook (không gọi bộ cấp phát trước đó), hàm PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;39 phải được gọi để cài đặt lại các hook gỡ lỗi ở trên cùng trên bộ cấp phát mới Xem thêm PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;40 và Khởi tạo trước Python với PyPreConfig . Cảnh báo PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;41 không có hợp đồng sau void PyMem_SetupDebugHooks(void)¶ Setup debug hooks in the Python memory allocators to detect memory errors. Gỡ lỗi móc trên bộ cấp phát bộ nhớ Python¶Khi Python được xây dựng ở chế độ gỡ lỗi , hàm PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;39 được gọi tại Khởi tạo trước Python< . to setup debug hooks on Python memory allocators to detect memory errors. Biến môi trường PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;61 có thể được sử dụng để cài đặt móc gỡ lỗi trên Python được biên dịch ở chế độ phát hành (ví dụ:. PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;47) Hàm PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;39 có thể được sử dụng để đặt móc gỡ lỗi sau khi gọi PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;41 Các móc gỡ lỗi này lấp đầy các khối bộ nhớ được cấp phát động bằng các mẫu bit đặc biệt, dễ nhận biết. Bộ nhớ mới được cấp phát chứa đầy byte PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;50 (_______151), bộ nhớ được giải phóng chứa đầy byte PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;52 ( PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;53). Các khối bộ nhớ được bao quanh bởi “các byte bị cấm” chứa đầy byte PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;54 ( PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;55). Các chuỗi byte này không có khả năng là địa chỉ hợp lệ, số float hoặc chuỗi ASCII kiểm tra thời gian chạy
Khi có lỗi, các móc gỡ lỗi sử dụng mô-đun PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;62 để truy xuất nguồn gốc nơi một khối bộ nhớ được phân bổ. Traceback chỉ được hiển thị nếu PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;62 đang theo dõi phân bổ bộ nhớ Python và khối bộ nhớ đã được theo dõi Đặt S = PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;64. PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;65 byte được thêm vào mỗi đầu của mỗi khối N byte được yêu cầu. Bố cục bộ nhớ giống như vậy, trong đó p đại diện cho địa chỉ được trả về bởi một hàm giống malloc hoặc realloc ( PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;66 có nghĩa là lát byte từ PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;67 bao gồm cho đến loại trừ PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;68; lưu ý rằng cách xử lý các chỉ số âm khác với lát Python PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;69 Số byte ban đầu được yêu cầu. Đây là size_t, big-endian (dễ đọc hơn trong kết xuất bộ nhớ) PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;70 Mã định danh API (ký tự ASCII)
PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;77 Bản sao của PYMEM_FORBIDDENBYTE. Được sử dụng để bắt ghi dưới và đọc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;78 Bộ nhớ được yêu cầu, chứa đầy các bản sao của PYMEM_CLEANBYTE, được sử dụng để bắt tham chiếu đến bộ nhớ chưa được khởi tạo. Khi một hàm giống realloc được gọi yêu cầu khối bộ nhớ lớn hơn, các byte dư thừa mới cũng được lấp đầy bằng PYMEM_CLEANBYTE. Khi một chức năng giống như tự do được gọi, chúng sẽ được ghi đè bằng PYMEM_DEADBYTE, để bắt tham chiếu đến bộ nhớ được giải phóng. Khi một chức năng giống như realloc được gọi yêu cầu một khối bộ nhớ nhỏ hơn, các byte cũ dư thừa cũng được lấp đầy bằng PYMEM_DEADBYTE PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;79 Bản sao của PYMEM_FORBIDDENBYTE. Được sử dụng để ghi đè và đọc PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;80 Chỉ được sử dụng nếu macro PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;81 được xác định (không được xác định theo mặc định) Một số sê-ri, được tăng thêm 1 trên mỗi lần gọi hàm giống malloc hoặc giống realloc. Big-endian PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;82. Nếu “bộ nhớ kém” được phát hiện sau đó, số sê-ri sẽ cung cấp một cách tuyệt vời để đặt điểm dừng trong lần chạy tiếp theo, để ghi lại khoảnh khắc mà khối này được chuyển đi. Hàm tĩnh bumpserialno() trong obmalloc. c là nơi duy nhất số sê-ri được tăng lên và tồn tại để bạn có thể dễ dàng đặt điểm dừng như vậy Trước tiên, chức năng giống như realloc hoặc giống như tự do sẽ kiểm tra xem các byte PYMEM_FORBIDDENBYTE ở mỗi đầu có còn nguyên vẹn không. Nếu chúng đã bị thay đổi, đầu ra chẩn đoán được ghi vào thiết bị lỗi chuẩn và chương trình bị hủy bỏ qua Py_FatalError(). Chế độ lỗi chính khác đang gây ra lỗi bộ nhớ khi chương trình đọc một trong các mẫu bit đặc biệt và cố gắng sử dụng nó làm địa chỉ. Sau đó, nếu bạn vào trình gỡ lỗi và nhìn vào đối tượng, bạn có thể thấy rằng nó hoàn toàn chứa đầy PYMEM_DEADBYTE (có nghĩa là bộ nhớ được giải phóng đang được sử dụng) hoặc PYMEM_CLEANBYTE (có nghĩa là bộ nhớ chưa được khởi tạo đang được sử dụng) Đã thay đổi trong phiên bản 3. 6. Hàm PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;39 hiện cũng hoạt động trên Python được biên dịch ở chế độ phát hành. Khi có lỗi, các móc gỡ lỗi hiện sử dụng PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;62 để truy xuất nguồn gốc nơi một khối bộ nhớ được cấp phát. Các móc gỡ lỗi hiện cũng kiểm tra xem GIL có được giữ hay không khi các chức năng của miền PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;58 và PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;60 được gọi. Đã thay đổi trong phiên bản 3. 8. Các mẫu byte PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;87 ( PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;51), PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;89 ( PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;53) và PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;91 ( PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;55) đã được thay thế bằng PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;50, PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;52 và PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;54 để sử dụng các giá trị giống như gỡ lỗi Windows CRT PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;57 và PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;60. Bộ cấp phát pymalloc¶Python có bộ cấp phát pymalloc được tối ưu hóa cho các đối tượng nhỏ (nhỏ hơn hoặc bằng 512 byte) với thời gian tồn tại ngắn. Nó sử dụng ánh xạ bộ nhớ được gọi là "đấu trường" với kích thước cố định là 256 KiB. Nó rơi trở lại PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;1 và PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;92 cho các phân bổ lớn hơn 512 byte pymalloc là bộ cấp phát mặc định của PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;60 (ví dụ:. PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;4) và PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;58 (ví dụ:. PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;2) tên miền. Bộ phân bổ đấu trường sử dụng các chức năng sau
Bộ cấp phát này bị tắt nếu Python được định cấu hình với tùy chọn PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;10. Nó cũng có thể bị vô hiệu hóa trong thời gian chạy bằng cách sử dụng biến môi trường PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;61 (ví dụ:. PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;12) Tùy chỉnh Công cụ phân bổ đấu trường pymalloc¶Mới trong phiên bản 3. 4 type PyObjectArenaAllocator ¶Cấu trúc được sử dụng để mô tả một bộ phân bổ đấu trường. Cấu trúc có ba trường. Đồng ruộng Nghĩa PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;17 ngữ cảnh người dùng được chuyển làm đối số đầu tiên PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;14 phân bổ một đấu trường có kích thước byte PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;15 giải phóng một đấu trường void PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator)¶Get the arena allocator. void PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator)¶Set the arena allocator. API tracemalloc C¶Mới trong phiên bản 3. 7 int PyTraceMalloc_Track(unsigned int domain, uintptr_t ptr, size_t size)¶Track an allocated memory block in the PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;62 module. Trả về PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;17 nếu thành công, trả về PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;18 nếu gặp lỗi (không thể cấp phát bộ nhớ để lưu dấu vết). Trả lại PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;19 nếu tracemalloc bị tắt Nếu khối bộ nhớ đã được theo dõi, hãy cập nhật dấu vết hiện có int PyTraceMalloc_Untrack(unsigned int domain, uintptr_t ptr)¶Untrack an allocated memory block in the PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;62 module. Do nothing if the block was not tracked. Trả lại PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;19 nếu dấu vết bị vô hiệu hóa, nếu không thì trả lại PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;17 Ví dụ¶Đây là ví dụ từ phần Tổng quan , được viết lại để bộ đệm I/O được phân bổ từ đống Python bằng cách sử dụng hàm đầu tiên . PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res; Mã tương tự sử dụng bộ chức năng định hướng kiểu PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res; Lưu ý rằng trong hai ví dụ trên, bộ đệm luôn được thao tác thông qua các hàm thuộc cùng một tập hợp. Thật vậy, bắt buộc phải sử dụng cùng một họ API bộ nhớ cho một khối bộ nhớ nhất định, để rủi ro trộn lẫn các bộ cấp phát khác nhau được giảm đến mức tối thiểu. Chuỗi mã sau có hai lỗi, một trong số đó được gắn nhãn là nghiêm trọng vì nó trộn lẫn hai bộ cấp phát khác nhau hoạt động trên các vùng khác nhau PyObject *res; char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Free(buf); /* allocated with PyMem_Malloc */ return res;9 Ngoài các chức năng nhằm mục đích xử lý các khối bộ nhớ thô từ heap Python, các đối tượng trong Python được cấp phát và giải phóng bằng PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;23, PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;24 và PyObject *res; char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ if (buf == NULL) return PyErr_NoMemory(); /* ...Do some I/O operation involving buf.. */ res = PyBytes_FromString(buf); PyMem_Del(buf); /* allocated with PyMem_New */ return res;25 Dữ liệu được lưu trữ trong bộ nhớ trong Python như thế nào?Tổng quan về Python - Tính bền bỉ của dữ liệu
. Sau đó, nội dung bộ nhớ từ RAM bị xóa. Data so received, is stored in computer's main memory (RAM) in the form of various data structures such as, variables and objects until the application is running. Thereafter, memory contents from RAM are erased.
Các đối tượng Python được lưu trữ trong bộ nhớ ở đâu?Cấp phát bộ nhớ trong Python
. heap memory.
Các đối tượng Python được biểu diễn trong bộ nhớ như thế nào?Python lưu trữ đối tượng trong bộ nhớ heap và tham chiếu của đối tượng trong ngăn xếp. Các biến, hàm được lưu trữ trong ngăn xếp và đối tượng được lưu trữ trong heap.
Python phân bổ bộ nhớ cho các biến như thế nào?Python tối ưu hóa việc sử dụng bộ nhớ bằng cách phân bổ cùng một tham chiếu đối tượng cho một biến mới nếu đối tượng đã tồn tại với cùng một giá trị . Đó là lý do tại sao python được gọi là bộ nhớ hiệu quả hơn. |