Python:ctypes + C malloc错误。 C内存问题还是Python / ctypes问题?

时间:2011-06-03 17:47:42

标签: python c malloc ctypes

大家。我使用ctypes和C代码时出现内存分配错误。我想知道内存问题是否在C内部,或者是由于ctypes使用不当引起的。内存错误是

  

python(79698)malloc: *对象0x15627ac08的错误:释放对象的校验和错误> - 对象可能在被释放后被修改。   * 在malloc_error_break中设置断点以进行调试   中止

  

python(76110,0x7fff70062ca0)malloc: *对象0x7d807e1078907df的错误:指针未被分配>释放   * 在malloc_error_break中设置断点以进行调试   中止

取决于我如何编写下面代码的“free_some_memory”部分。我不会在这里发布一堆C代码,但假设我已正确编写C代码,我的ctypes界面看起来是否正确?

此外,对于给定版本的“free_some_memory”,我遇到的失败并不总是发生在我的脚本中的相同位置。 我的C代码内存管理是否可能写得不好,以至于Python内存管理可能会或可能不会破坏(de)分配?

Dunno如果这很重要,但我正在使用Mac,Snow Leopard 我们非常感谢您提供的任何帮助。

最佳, jkmacc

我的C代码如下:

/**** cfunction.c ****/
int cfun (double *y, char datafile[1024], int byteoffset, int num )
{
  allocate_some_memory;
  do_stuff;

  if ( error_condition )
  {
    free_some_memory;
    return ( -1 );
  }

  fill_y_here;
  free_some_memory;
  return ( 0 );
}

我的ctypes包装器看起来像:

#pyfunction.py

import ctypes as C
import numpy as np

lib = C.CDLL('mylib.dylib')

def pyfun(DATAFILE, BYTEOFFSET, NUM):
    """
    DATAFILE: a string file name
    BYTEOFFSET: an integer
    NUM: an integer
    """

    #return integer success/failure flag
    lib.cfun.restype = C.c_int 

    #array memory to be filled inside of C
    Y = np.empty(NUM,dtype='double',order='C')

    cDATAFILE = C.create_string_buffer(DATAFILE,1024) 
    cBYTEOFFSET = C.c_int(int(BYTEOFFSET))
    cNUM = C.c_int(int(NUM))

    flag = lib.cfun(Y.ctypes.data_as(C.POINTER(C.c_double)), \ 
               cDATAFILE,cBYTEOFFSET,cNUM)

    if flag == -1:
        print("Something went wrong.")
        return -1
    else:
        return Y

1 个答案:

答案 0 :(得分:4)

我遇到了这个问题,这就是我想到的:

如果使用ctypes映射某些内容然后将其释放,则在销毁ctypes对象时会出现错误。因此,在调用free()之前,需要确保python代码中没有剩余的对它的引用。

所以,你的C代码就像:

char* p;
char* allocate() {
 p = asprintf("hello world");
 return(p)
}
void freep() {
 free(p);
}

你的Python代码就像:

allocate = clib.allocate
allocate.restype = c_char_p()
p = allocate()
print p
# This is the key:
del(p)
clib.freep()

如果您想查看错误,请忽略del(p)