Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
第二次调用PyObject_CallObject()时出现分段错误 我正在编写一个C++类,调用Python脚本。但当我调用该方法一秒钟时,它就停止工作了。我搜索了所有地方,没有找到任何线索。我认为这是因为ref计数问题,所以我删除了所有的Py\u DECREF调用,但仍然没有帮助 这里是C++代码(在原代码中,我每次调用 PyObjutsGETAsTraceS/ >每次在RunMeult/COD>中,但在第二次调用GDB中指示第二个代码> FUNC >代码> 。所以我改为:_Python_C++_Segmentation Fault - Fatal编程技术网

第二次调用PyObject_CallObject()时出现分段错误 我正在编写一个C++类,调用Python脚本。但当我调用该方法一秒钟时,它就停止工作了。我搜索了所有地方,没有找到任何线索。我认为这是因为ref计数问题,所以我删除了所有的Py\u DECREF调用,但仍然没有帮助 这里是C++代码(在原代码中,我每次调用 PyObjutsGETAsTraceS/ >每次在RunMeult/COD>中,但在第二次调用GDB中指示第二个代码> FUNC >代码> 。所以我改为:

第二次调用PyObject_CallObject()时出现分段错误 我正在编写一个C++类,调用Python脚本。但当我调用该方法一秒钟时,它就停止工作了。我搜索了所有地方,没有找到任何线索。我认为这是因为ref计数问题,所以我删除了所有的Py\u DECREF调用,但仍然没有帮助 这里是C++代码(在原代码中,我每次调用 PyObjutsGETAsTraceS/ >每次在RunMeult/COD>中,但在第二次调用GDB中指示第二个代码> FUNC >代码> 。所以我改为:,python,c++,segmentation-fault,Python,C++,Segmentation Fault,这是我的gdb输出: (gdb) break 40 Breakpoint 1 at 0x401f47: file pdr.cpp, line 40. (gdb) run Starting program: /home/dickzhou/data/sex_256/c++/a.out [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib64/libthread_db.so.1". //l

这是我的gdb输出:

(gdb) break 40
Breakpoint 1 at 0x401f47: file pdr.cpp, line 40.
(gdb) run
Starting program: /home/dickzhou/data/sex_256/c++/a.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
//loaded
///home/dickzhou/data/face/male/24-28/24/135.JPG

Breakpoint 1, RunModel (size=14637, imageBytes=0x6e5270 "\377\330\377", <incomplete sequence \340>, this=0x7fffffffe040) at pdr.cpp:40
40          result = PyObject_CallObject(func, args);
Missing separate debuginfos, use: debuginfo-install glibc-2.17-105.el7.x86_64 libgcc-4.8.5-16.el7.x86_64 libstdc++-4.8.5-4.el7.x86_64 python-libs-2.7.5-34.el7.x86_64
(gdb) p func
$1 = (PyObject *) 0x2aaaaabfa9b0
(gdb) p args
$2 = (PyObject *) 0x2aaaaabf2d10
(gdb) c
Continuing.
a
///home/dickzhou/data/face/female/24-28/24/138.JPG

Breakpoint 1, RunModel (size=13572, imageBytes=0x68d9f0 "\377\330\377", <incomplete sequence \340>, this=0x7fffffffe040) at pdr.cpp:40
40          result = PyObject_CallObject(func, args);
(gdb) p func
$3 = (PyObject *) 0x2aaaaabfa9b0
(gdb) p args
$4 = (PyObject *) 0x2aaaaab8bbd0
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x00002aaaab33c09a in PyObject_Call () from /lib64/libpython2.7.so.1.0
(gdb)

谢谢你的帮助,我已经解决了这个问题

问题是解构函数被调用了两次,因为
task
函数是按值传递的。我将其更改为通过引用传递:

int task(PyRecognitionContext *pr, string fileName) {
  cout << "//";
  cout << fileName << endl;
  std::ifstream ifs(fileName.c_str(), ios::binary|ios::ate);
  size_t imgSize = ifs.tellg();
  char *result = new char[imgSize];
  ifs.seekg(0, ios::beg);
  ifs.read(result, imgSize);
  ifs.close();
  std::cout << pr->RunModel(result, imgSize) << endl;
  return 0;
}
int任务(PyRecognitionContext*pr,字符串文件名){

谢谢你的帮助,我已经解决了这个问题

问题是解构函数被调用了两次,因为
任务
函数是按值传递的。我将其更改为按引用传递:

int task(PyRecognitionContext *pr, string fileName) {
  cout << "//";
  cout << fileName << endl;
  std::ifstream ifs(fileName.c_str(), ios::binary|ios::ate);
  size_t imgSize = ifs.tellg();
  char *result = new char[imgSize];
  ifs.seekg(0, ios::beg);
  ifs.read(result, imgSize);
  ifs.close();
  std::cout << pr->RunModel(result, imgSize) << endl;
  return 0;
}
int任务(PyRecognitionContext*pr,字符串文件名){

cout您的实际问题并没有随之而来。您有一个手动管理的类,其中包含资源(资源是以后需要释放的任何资源)。这不行

复制
PyRecognitionContext
的实例,并调用
Py_Finalize()
两次,而且调用过早

全局Python上下文需要初始化和终结。我们可以将其委托给单独的类,以促进单一责任原则

struct PyContext
{
    PyContext()
    {
        Py_Initialize();
    }

    ~PyContext()
    {
        Py_Finalize();
    }

    PyContext& operator=(const PyContext&) = delete;
    PyContext(const PyContext&) = delete;
    PyContext& operator=(PyContext&&) = delete;
    PyContext(PyContext&&) = delete;
};
现在,您可以将该类的一个成员放入您的PyRecognitionContext中

class PyRecognitionContext {
    PyContext pyContext;

    // ... rest of the code
};
这会将运行时错误移到编译时


其他Python对象也是资源,因为它们需要释放。

您的实际问题不在后面。您有一个手动管理资源的类(资源是以后需要释放的任何资源)。这不行

复制
PyRecognitionContext
的实例,并调用
Py_Finalize()
两次,而且调用过早

全局Python上下文需要初始化和终结。我们可以将其委托给单独的类,以促进单一责任原则

struct PyContext
{
    PyContext()
    {
        Py_Initialize();
    }

    ~PyContext()
    {
        Py_Finalize();
    }

    PyContext& operator=(const PyContext&) = delete;
    PyContext(const PyContext&) = delete;
    PyContext& operator=(PyContext&&) = delete;
    PyContext(PyContext&&) = delete;
};
现在,您可以将该类的一个成员放入您的PyRecognitionContext中

class PyRecognitionContext {
    PyContext pyContext;

    // ... rest of the code
};
这会将运行时错误移到编译时


其他Python对象也是资源,因为它们需要被释放。

您永远不会检查Python函数的返回值。您必须始终检查返回值,并根据返回值采取行动!@AnttiHaapala我只是快速原型化,肯定会清理这一混乱局面。我认为这与问题无关,对吗?可能是这样的非常感谢,但我们现在不知道是不是!?!无论如何,
Py_nonestuct
None
的实现对象,因此您的函数是
None
,并且
None
不可调用,因此
PyObject\u CallObject
将返回
NULL
@AnttiHaapala感谢您的帮助。但是在我发布的代码中,
func
不是
None
,您可以在gdb输出中看到它。它的值与上一次调用的值相同。我刚才甚至检查了一下以确定,还有
PyCallable\u检查(func)
returned
1
,我认为这意味着它可以被调用。你永远不会检查Python函数的返回值。你必须始终检查返回值,并根据返回值采取行动!@AnttiHaapala我只是快速创建原型,肯定会清理这一混乱局面。我认为这与问题无关,对吗?它可能会非常复杂e、 但是我们现在不知道,是吗!?!无论如何,
Py_nonestuct
None
的实现对象,所以你的函数是
None
并且
None
是不可调用的,所以
PyObject\u CallObject
将返回
NULL
@AnttiHaapala感谢你的帮助。但是在我发布的代码中,
func
不是
None
,您可以在gdb输出中看到它。它的值与上次调用的值相同。我刚才甚至检查了一下以确定它是否正确,以及
PyCallable\u检查(func)
返回了
1
,我认为这意味着它可以被调用。您也在泄漏内存,分配的bytestring永远不会被释放。您也在泄漏内存,分配的bytestring永远不会被释放。