混合语言F77 / C ++:避免​​破坏C ++实例

时间:2012-12-10 16:57:47

标签: c++ memory-management fortran destruction

我需要将Fortran和C ++混合在一起。 我写过C ++类。由于extern“C”函数调用C ++库,我能够调用C ++公共函数。

此函数创建此C ++ classe的一些实例。当这个函数结束时,我希望将这些实例保留在内存中以便在之后调用它们。但是破坏我的实例会被自动调用。

我不想在Fortran中使用这些实例,而是在其他包装的C ++函数中使用它们。 我不能使用iso_c_binding或任何Fortran 2003函数(不幸的是)。

你有什么简单的想法让实例留在记忆中吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果要在下次输入相同的函数时再次访问相同的C ++对象,可以在函数内将它们声明为static。 这将使函数的每次调用共享同一组(静态)变量。

如果多个函数需要访问同一个对象,则可以在命名空间作用域中定义它们(在任何函数或类之外)。访问对象的函数的所有调用都将共享相同的全局变量。

如果你不希望隐式共享通过使它们成为全局或static而隐含的实例,那么最好的选择(无论如何最好的选择)是在类的周围用create /编写一个C包装器销毁动态分配类实例的函数。 例如:

// 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();
}