mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Fix a few more memory leaks
Document more info about the benefits of configuring without pymalloc when running valgrind
This commit is contained in:
parent
4aef41ffe7
commit
7bcabc60a3
4 changed files with 29 additions and 3 deletions
|
@ -12,6 +12,19 @@ Misc/valgrind-python.supp. Second, you must do one of the following:
|
|||
* Uncomment the lines in Misc/valgrind-python.supp that
|
||||
suppress the warnings for PyObject_Free and PyObject_Realloc
|
||||
|
||||
If you want to use Valgrind more effectively and catch even more
|
||||
memory leaks, you will need to configure python --without-pymalloc.
|
||||
PyMalloc allocates a few blocks in big chunks and most object
|
||||
allocations don't call malloc, they use chunks doled about by PyMalloc
|
||||
from the big blocks. This means Valgrind can't detect
|
||||
many allocations (and frees), except for those that are forwarded
|
||||
to the system malloc. Note: configuring python --without-pymalloc
|
||||
makes Python run much slower, especially when running under Valgrind.
|
||||
You may need to run the tests in batches under Valgrind to keep
|
||||
the memory usage down to allow the tests to complete. It seems to take
|
||||
about 5 times longer to run --without-pymalloc.
|
||||
|
||||
|
||||
Details:
|
||||
--------
|
||||
Python uses its own small-object allocation scheme on top of malloc,
|
||||
|
@ -21,7 +34,8 @@ Valgrind may show some unexpected results when PyMalloc is used.
|
|||
Starting with Python 2.3, PyMalloc is used by default. You can disable
|
||||
PyMalloc when configuring python by adding the --without-pymalloc option.
|
||||
If you disable PyMalloc, most of the information in this document and
|
||||
the supplied suppressions file will not be useful.
|
||||
the supplied suppressions file will not be useful. As discussed above,
|
||||
disabling PyMalloc can catch more problems.
|
||||
|
||||
If you use valgrind on a default build of Python, you will see
|
||||
many errors like:
|
||||
|
|
12
Python/ast.c
12
Python/ast.c
|
@ -1054,8 +1054,12 @@ ast_for_listcomp(struct compiling *c, const node *n)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (asdl_seq_LEN(t) == 1)
|
||||
if (asdl_seq_LEN(t) == 1) {
|
||||
lc = comprehension(asdl_seq_GET(t, 0), expression, NULL);
|
||||
/* only free the sequence since we grabbed element 0 above */
|
||||
if (lc)
|
||||
asdl_seq_free(t); /* ok */
|
||||
}
|
||||
else
|
||||
lc = comprehension(Tuple(t, Store, LINENO(ch)), expression, NULL);
|
||||
|
||||
|
@ -1222,9 +1226,13 @@ ast_for_genexp(struct compiling *c, const node *n)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (asdl_seq_LEN(t) == 1)
|
||||
if (asdl_seq_LEN(t) == 1) {
|
||||
ge = comprehension(asdl_seq_GET(t, 0), expression,
|
||||
NULL);
|
||||
/* only free the sequence since we grabbed element 0 above */
|
||||
if (ge)
|
||||
asdl_seq_free(t); /* ok */
|
||||
}
|
||||
else
|
||||
ge = comprehension(Tuple(t, Store, LINENO(ch)),
|
||||
expression, NULL);
|
||||
|
|
|
@ -2384,7 +2384,10 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
|
|||
dot = strchr(src, '.');
|
||||
attr = PyString_FromStringAndSize(src,
|
||||
dot ? dot - src : strlen(src));
|
||||
if (!attr)
|
||||
return -1;
|
||||
ADDOP_O(c, LOAD_ATTR, attr, names);
|
||||
Py_DECREF(attr);
|
||||
src = dot + 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -82,6 +82,7 @@ Py_InitModule4(char *name, PyMethodDef *methods, char *doc,
|
|||
}
|
||||
Py_DECREF(v);
|
||||
}
|
||||
Py_DECREF(n);
|
||||
}
|
||||
if (doc != NULL) {
|
||||
v = PyString_FromString(doc);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue