Pointers 如何在Cython中正确释放指向指针的指针?

Pointers 如何在Cython中正确释放指向指针的指针?,pointers,compiler-errors,cython,free,cythonize,Pointers,Compiler Errors,Cython,Free,Cythonize,我想释放分配给一个变量的内存,该变量是指向指针的指针(或“”——不要与指向双精度数据类型的指针混淆) 假设指向指针的指针是**ptr,为简单起见,它是一个10x10的整数数组。接下来,我看到一种分配空间的方法如下 from cpython.mem cimport PyMem_Malloc, PyMem_Free ## Allocate memory cdef int **ptr = <int **>PyMem_Malloc(sizeof(int *) * 10) cdef i; f

我想释放分配给一个变量的内存,该变量是指向指针的指针(或“”——不要与指向双精度数据类型的指针混淆)

假设指向指针的指针是
**ptr
,为简单起见,它是一个10x10的整数数组。接下来,我看到一种分配空间的方法如下

from cpython.mem cimport PyMem_Malloc, PyMem_Free

## Allocate memory
cdef int **ptr = <int **>PyMem_Malloc(sizeof(int *) * 10)
cdef i;
for i in range(10):
    ptr[i] = <int *>PyMem_Malloc(sizeof(int) * 10)

## Free memory
for i in range(10):
    PyMem_Free(<void *>ptr[i])
PyMem_Free(<void *>ptr)

这个问题与C指针的Cython非常类似。

您使用的是什么版本的Cython?您的代码在我的机器上运行得很好。谢谢您的快速响应。有趣!我的Cython版本是:Cython版本0.25.2。这几乎是最新的,不是吗?是的
0.25.2
是最新的版本。如果在释放内存时强制转换为
而不是
,错误是否会消失?还是根本不选演员?@PavithranIyer我看不出哪里出了问题(尽管很明显,它工作不正常)。我不会对罗梅里克说“为他工作”给予太多的重视——如果你幸运的话,完全有可能不碰到确实存在的记忆错误。我的一般建议是:对于2D数组,避免指针指向指针。通常,分配一个1D数组并使用步幅/形状计算其中的位置更有效。@DavidW哦,好的,我明白了。很高兴知道它不适合你,至少我们的意见一致!好的,如果我没弄错的话,你建议总是使用1D数组还是只使用(1级)指针?在我的问题中,10x10阵列只是为了提供一个代码片段。在我的应用程序中,我确实需要一个多维(锯齿数组)指针指向指向。。。不管指针的尺寸如何,C中的一个非常类似的策略似乎也能起作用。Cython应该不会比这更难吧?也许
PyMem\u Malloc
PyMem\u Free
行为怪异?
python(4522,0x7fffd08143c0) malloc: *** error for object 0x1172c8054: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6