相关疑难解决方法(0)

Python C模块 - Malloc在特定版本的Python中失败

我正在编写一个Python模块来在O_DIRECT上下文中执行IO.O_DIRECT的一个限制是你必须读入对应于2.4和2.5内核的4096字节边界的缓冲区,2.6及以上将接受512的任意倍数.

对此明显的内存分配候选是 posix_memalign(void **memptr, size_t alignment, size_t size)

在我的代码中,我分配了一个像这样的区域:

char *buffer = NULL;

int mem_ret = posix_memalign((void**)&buffer, alignment, size);

if (!buffer) {
    PyErr_NoMemory();
    return NULL;
}

/* I do some stuff here */

free(buffer);
Run Code Online (Sandbox Code Playgroud)

当我用python3.2编译和导入模块时,这个(以及未示出的模块的其余部分)工作正常.

当我尝试使用python2.7(我想保持兼容性)时,它会抛出PyErr_NoMemory异常,并mem_ret == ENOMEM指示它无法分配.

为什么我编译的Python版本会影响posix_memalign的运行方式?

操作系统:Ubuntu 12.04 LTS

编译器:Clang + GCC显示相同的行为

UPDATE

我现在有了一段代码,感谢user694733
但是它的工作原理使我更加困惑:

#if PY_MAJOR_VERSION >= 3
char *buffer = NULL;

int mem_ret = posix_memalign((void**)&buffer, alignment, count);
#else
void *mem = NULL;

int mem_ret = posix_memalign(&mem, alignment, count);

char *buffer = (char*)mem;
#endif …
Run Code Online (Sandbox Code Playgroud)

c python memory-management cpython

9
推荐指数
1
解决办法
795
查看次数

从 Foo** 到 void** 的无效转换 - 为什么隐式类型转换允许到 void* 而不允许到 void**?

struct Foo {};
...
void * p = (Foo*)0; // OK
void ** pp = (Foo**)0; // Invalid conversion
Run Code Online (Sandbox Code Playgroud)

据我所知,void*在 C++ 中可以隐式转换为指向任何非指针类型的指针。为什么同样不允许将 ponter 转换为指针类型 to void**

c++ gcc type-conversion

2
推荐指数
1
解决办法
163
查看次数

标签 统计

c ×1

c++ ×1

cpython ×1

gcc ×1

memory-management ×1

python ×1

type-conversion ×1