Повреждение кучи с использованием python35.dll в C ++ для вызова функции - PullRequest
0 голосов
/ 03 июня 2019

Я пробую действительно простую программу "hello world", которая должна встраивать скрипт python в мое консольное приложение C ++, но Visual Studio обнаруживает повреждение кучи на Py_XDECREF(pFunc);

Я уже смог запустить PyRun_SimpleFile() для сценария Python без определений и возвратов, но для моего будущего приложения мне нужна функция Python с возвратами, поэтому PyRun_SimpleFile() не вариант.

Мой код, основанный на этом введении :

main.cpp

#include "stdafx.h"
#include <stdlib.h>
#include <Python.h>

int main(int argc, char *argv[])
{
    Py_SetPythonHome(L"C:/Program Files/Python35");
    Py_Initialize();
    PyObject *pModule;
    PyObject *pFunc, *pValue;

    pModule = PyImport_ImportModule("HelloWorld");

    if (pModule)
    {
        pFunc = PyObject_GetAttrString(pModule, "getInteger");
        if (pFunc && PyCallable_Check(pFunc))
        {
            pValue = PyObject_CallObject(pFunc, NULL);
            printf_s("C: getInteger() = %ld\n", PyLong_AsLong(pValue));
            Py_XDECREF(pValue);
        }
        else
        {
            printf("ERROR: function getInteger()\n");
        }
        Py_XDECREF(pFunc);
    }
    else
    {
        printf_s("ERROR: Module not imported\n");
    }

    Py_XDECREF(pModule);

    Py_Finalize();
    return 0;
}

HelloWorld.py (в папке Debug моего решения VS2015):

def getInteger():
    print('Python function getInteger() called')
    c = 100*2
    return c

Я уже попробовал флаг _CRTDBG_CHECK_ALWAYS_DF, но он не сломался на линии разрушения кучи.

...