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

Ở 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à

  • Tên miền thô. dành cho việc cấp phát bộ nhớ cho các bộ đệm bộ nhớ có mục đích chung, nơi cấp phát phải đến bộ cấp phát hệ thống hoặc nơi cấp phát có thể hoạt động mà không cần GIL . Bộ nhớ được yêu cầu trực tiếp đến hệ thống.

  • Miền “Mem”. dành cho việc cấp phát bộ nhớ cho bộ đệm Python và bộ đệm bộ nhớ đa năng trong đó việc cấp phát phải được thực hiện với GIL được giữ. Bộ nhớ được lấy từ đống riêng của Python.

  • miền đối tượng. dành cho việc phân bổ bộ nhớ thuộc về các đối tượng Python. Bộ nhớ được lấy từ đống riêng của Python

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

  • 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;
    
    598

  • 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;
    
    599

  • 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;
    
    600

  • 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;
    
    601

  • 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;
    
    602

  • 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;
    
    603

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ào

void *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ên. giá trị cho 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

  • 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ộ cấp phát hệ thống từ thư viện C tiêu chuẩn, hàm 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;
    
    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

  • ____1626. bộ cấp phát bộ nhớ pymalloc .

  • “+ gỡ lỗi”. với móc gỡ lỗi trên bộ cấp phát bộ nhớ Python .

  • “Bản dựng gỡ lỗi”. Bản dựng Python ở chế độ gỡ lỗi .

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.

  • 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

  • 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

  • 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;
    
    28

PYMEM_DOMAIN_MEM

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;
    
    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

  • 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

  • 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

PYMEM_DOMAIN_OBJ

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;
    
    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

  • 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

  • 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;
    
    36

void PyMem_GetAllocator(PyMemAllocatorDomain miền, PyMemAllocatorEx *allocator)

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

  • Có thể gọi 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;
    
    42 và 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;
    
    43 để cài đặt bộ cấp phát bộ nhớ tùy chỉnh. Không có hạn chế nào đối với bộ cấp phát đã cài đặt ngoài những hạn chế do miền áp đặt (ví dụ: Miền thô cho phép gọi bộ cấp phát mà không cần giữ GIL). Xem phần về miền cấp phát để biết thêm thông tin.

  • Nếu được gọi sau khi Python khởi tạo xong (sau khi gọi xong

    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;
    
    43), bộ cấp phát phải bọc bộ cấp phát hiện có. Thay thế bộ cấp phát hiện tại cho một số tùy ý khác không được hỗ trợ

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

  • Phát hiện vi phạm API. Ví dụ: phát hiện xem

    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;
    
    36 có được gọi trên khối bộ nhớ được cấp phát bở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 hay không

  • Phát hiện ghi trước khi bắt đầu bộ đệm (chảy tràn bộ đệm)

  • Phát hiện ghi sau khi kết thúc bộ đệm (tràn bộ đệm)

  • Kiểm tra xem GIL có được giữ khi chức năng cấp phát 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;
    
    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) 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 (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) tên miền được gọi là.

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;
    
    71 cho
    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

  • 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;
    
    73 cho
    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

  • 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;
    
    75 cho
    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;
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

  • 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;
    
    04 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;
    
    05 trên Windows,

  • 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;
    
    06 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;
    
    07 nếu 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;
    
    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 ngược lại

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á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.