sanya84
@sanya84
Фанатик Python 3

С++ Как узнать подробности об ошибке?

CppHello.cpp
// файл реализации класса CppHello.cpp
// подключаем интерфейс класса к файлу его реализации

#include "HHello.h"
#include <string>

using namespace hello;
using namespace std;

CppHello::CppHello() // конструктор класса
{
}

CppHello::~CppHello() // деструктор класса
{
}

void CppHello::setName(char *value) {
    name = value;
}

char *CppHello::message() {
    greeting = " Hello!!!";
    result = strcat(greeting, name); // Сдесь программа вылетает
    return result;

}

HHello.h

/ заголовочный файл класса HHello.h
// интерфейс класса

namespace hello {
// объявление класса
class CppHello // имя класса
{
public: // спецификатор доступа public
    // пример объявления строки
    char *name = new char[1000]; // name
    char *greeting = new char[1000];
    char *result = new char[1000];
    CppHello(); // конструктор класса
    ~CppHello();
    void setName(char *name);
    char *message(); // функция (метод класса) выводящая сообщение на экран
}; // конец объявления класса CppHello
}

Реализация в Python это всё для создания модуля python из C++
hello.pyx
cdef extern from "HHello.h" namespace "hello":
    cdef cppclass CppHello:
        CppHello() except +
        void setName(char *) except +
        char *message() except +

cdef class PyHello:
    cdef CppHello *cpp_hello
    def __cinit__(self):
        self.cpp_hello = new CppHello()

    def __dealloc__(self):
        del self.cpp_hello

    def setName(self, name):
        self.cpp_hello.setName(name.encode())

    def message(self):
        return "{0}".format(self.cpp_hello.message().decode())

main.py
#-------------------------------------------------------------------------------
# Name:        main
# Purpose:
#
# Author:      ALEX
#
# Created:     06.01.2019
# Copyright:   (c) ALEX 2019
# Licence:     <your licence>
#-------------------------------------------------------------------------------
from time import sleep
from hello import PyHello

def main():
    hello = PyHello()
    hello.setName("Александр")
    # Программа вылетает здесь и Python не ловит ошибку. Да в try except помещал всё равно падает программа 
    print(hello.message()) # -->По задумке должно быть так  Привет Александр
  


if __name__ == '__main__':
    main()
    sleep(3)
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
GavriKos
@GavriKos
Запустите с отладчиком. Можете так же завернуть в try-catch.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Alexander1705
greeting = " Hello!!!";
result = strcat(greeting, name); // Сдесь программа вылетает

Конечно же вылетает. Используйте std::string, или научитесь работать с указателями.

Утечка памяти 1: CppHello::~CppHello() {}.
Утечка памяти 2: name = value;.
Утечка памяти 3: greeting = " Hello!!!";.
Запись в защищённую область памяти: strcat(greeting, name);

P. S. Segmentation fault не бросает исключения. Перехватить его можно, но не нужно. Отладчик покажет, где происходит segfault.

P. P. S. Здесь подробнее про вашу ошибку: Writing to read-only memory
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы