Дамп ядра памяти C ++ - PullRequest
       38

Дамп ядра памяти C ++

0 голосов
/ 07 марта 2019

Теперь я вызвал Python для C ++.Использование ctype для соединения между ними.И у меня проблема с дампом ядра во время выполнения.

У меня есть библиотека, которая называется "libfst.so". Это мой код.NGramFST.h

#include <iostream>
class NGramFST{
private:
    static NGramFST* m_Instace;

public:
    NGramFST(){
    }

    static NGramFST* getInstance() {
        if (m_Instace == NULL){
            m_Instace = new NGramFST();
        }
        return m_Instace;
    }

    double getProbabilityOfWord(std::string word, std::string context) {
        std::cout << "reloading..." << std::endl;
        return 1;
    }

};

NGramFST.cpp

#include "NGramFST.h"
NGramFST* NGramFST::m_Instace = NULL;

extern "C" {
    double FST_getProbability(std::string word, std::string context){
        return NGramFST::getInstance()->getProbabilityOfWord(word, context);
    }
}

А это мой код Python.

from ctypes import cdll
lib = cdll.LoadLibrary('./libfst.so')

#-------------------------main code------------------------
class FST(object):
    def __init__(self):
        print 'Initializing'

    def getProbabilityOfWord(self, word, context):
        lib.FST_getProbability(word, context)

fst = FST()
print fst.getProbabilityOfWord(c_wchar_p('jack london'), c_wchar_p('my name is'))

Это ошибка

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)

Я пересмотрел еще раз, но не могу определить, где моя проблема.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

ctypes не понимает типы C ++ (это не называется c++types).Он не может обрабатывать std::string.Он не знал бы, что ваша функция ожидает std::string аргументов в любом случае.

Для работы с ctypes вашей библиотеке необходим C-совместимый интерфейс.extern "C" необходимо, но не достаточно.Функции на самом деле должны вызываться из C.

Еще лучше, используйте современную библиотеку связывания C ++ / Python, такую ​​как pybind11 .

0 голосов
/ 07 марта 2019

Это работает, когда я изменяю код Python ниже

string1 = "my string 1"
string2 = "my string 2"

# create byte objects from the strings
b_string1 = string1.encode('utf-8')
b_string2 = string2.encode('utf-8')

print fst.getProbabilityOfWord(b_string1, b_string2)

и код C ++ изменяют тип параметра ниже

FST_getProbability(const char* word, const char* context)
...