【发布时间】:2018-05-29 14:07:19
【问题描述】:
我在 Python/C API 和内存分配方面具有开发技能,并且预计以下 Python 嵌入式 C++ 代码会出现问题并导致类似于分段错误的情况:
#include <Python.h>
#include <iostream>
int main(){
Py_Initialize();
PyObject* pythonList = Py_BuildValue("[i i]",1,2);
Py_DECREF(pythonList); // I checked with Py_REFCNT(pythonList) that reference count is now 0
PyList_Check(pythonList); // hence, I was expecting here something like a segmentation fault, but this does not happen...
std::cout << "Ok, goodbye" << std::endl;
return 0;
}
但是,运行时并没有发生任何不好的事情(并且会显示“Ok, goodbye”)。
尽管访问(在
PyList_Check(pythonList);中)一个已减为零的 PyObject,这段代码实际上是否正常?或者,这个代码是不是错误,只是运气好,这里没有发生分段错误(为什么?)?
【问题讨论】:
-
从释放的内存中读取会调用未定义的行为,而未定义行为的问题在于它的行为是未定义的。这意味着它可能导致崩溃,可能导致程序继续运行但给出不正确的结果,它可能导致程序继续运行并给出正确的结果,除非在特定类型的 CPU 等上。没有办法表征预期的行为,因为它是未定义的。唯一的解决方案是一开始就不要调用未定义的行为,这样您就不必担心它会做什么。
-
感谢提供和通过 cmets !
标签: c++ python-c-api reference-counting