управление памятью — смешанный язык F77 / C ++: избегать уничтожения экземпляра C ++

Мне нужно смешать Фортран и С ++ вместе.
Я написал класс C ++. Я могу вызывать открытую функцию C ++ благодаря функции extern «C», которая вызывает библиотеку C ++.

Эта функция создает несколько экземпляров этого класса C ++. Когда эта функция заканчивается, я хочу сохранить эти экземпляры в памяти, чтобы вызывать их после. Но уничтожение моих экземпляров вызывается автоматически.

Я не хочу использовать эти экземпляры с Fortran, но использовать их в другой обернутой функции C ++.
Я не могу использовать iso_c_binding или любую функцию Fortran 2003 (к сожалению).

У вас есть какие-нибудь простые идеи сохранить экземпляры в памяти?

Заранее спасибо.

0

Решение

Если вы хотите снова получить доступ к тем же объектам C ++ при следующем входе в ту же функцию, вы можете объявить их как static внутри функции.
Это заставит каждый вызов функции использовать один и тот же набор (статических) переменных.

Если нескольким функциям нужен доступ к одному и тому же объекту (ам), вы можете определить их в области пространства имен (вне какой-либо функции или класса). Все вызовы функций, которые обращаются к объектам, будут иметь одну и ту же глобальную переменную (и).

Если вы не хотите неявного совместного использования экземпляров, которое подразумевается, делая их глобальными или staticлучший вариант (лучший вариант в любом случае) — написать обертку C вокруг класса вместе с функциями create / destroy, которые динамически распределяют экземпляр класса.
Например:

// x.hpp
class X {
public:
X(int);
void foo();
};

// x_wrapper.h
extern "C" {
void* create_x(int arg);
void destroy_x(void* anX);
void x_foo(void* anX);
}

// x_wrapper.cpp
#include "x.hpp"#include "x_wrapper.h"
void* create_x(int arg) {
return new X(arg);
}

void destroy_x(void* anX) {
X* self = (X*)anX;
delete self;
}

void x_foo(void* anX) {
X* self = (X*)anX;
return self->foo();
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector