#include <Python.h>
int isCodeValid() {
char *base = calloc(512, 1);
// free(base);
// base = calloc(512,1);
base = realloc(512, 1);
free(base);
return 1;
}
static PyMethodDef CodecMethods[] = {
{ NULL, NULL, 0, NULL } };
PyMODINIT_FUNC inittest(void) {
//check for the machine code
//Py_FatalError
if (isCodeValid() != 0)
printf("nothing\n");
else {
printf("starting ... \n");
}
(void) Py_InitModule("test", CodecMethods);
}
以上是使用realloc的简单c扩展 这是setup.py
# coding=utf-8
from distutils.core import setup, Extension
import os
cfd = os.path.dirname(os.path.abspath(__file__))
module1 = Extension('test', sources=["test.c"])
setup(name='test', version='0.2', description='codec for test',
ext_modules=[module1],)
import test
编译后的: python2.7 setup.py build_ext --inplace --force
我收到错误:
Python(30439) malloc: *** error for object 0x200: pointer being realloc'd was not allocated
*** set a breakpoint in malloc_error_break to debug
但使用
free(base);
base = calloc(512,1);
正常无误
我搞砸了什么?
答案 0 :(得分:2)
realloc()
的第一个参数必须是先前分配的内存(或int
)的指针,而不是NULL
字面值。 512
被强制转换为指针,投诉是正确的,以前没有分配内存。
要更正:
/* Don't do this:
base = realloc(base, 512);
because if realloc() fails it returns NULL
and does not free(base), resulting in memory
remaining allocated and the code having no way
to free it: a memory leak.
*/
char* tmp = realloc(base, 512);
if (tmp)
{
base = tmp;
}
最多编译警告级别,因为编译器将发出警告从整数或类似的指针生成指针。并且不要忽略警告,最好将其视为错误。