我可以在RCpp中使用单例范式吗?

时间:2016-04-30 20:31:40

标签: c++ r singleton rcpp

我们正在尝试在R包中使用单例范例。独立测试C ++代码时,我们不会遇到任何问题或错误。当与Rcpp集成到R中时,除了" R已经崩溃之外,它没有输出崩溃。"我们受过良好教育的猜测指向了记忆问题。我们已经尝试将单例暴露给Rcpp并将其隐藏在不同的暴露类中,并且两次都没有输出崩溃。

然后我们尝试运行一个涉及使用单例范例的类的独立函数,并仅打印出有关该类的一些信息。我们成功运行了一个函数,但第二次运行总是打印坏值。

是否可以使用单例范例与Rcpp?

编辑:我们正在使用Rcpp模块。

1 个答案:

答案 0 :(得分:1)

我认为这不可能,除非你能以某种方式实现具有(公共)默认构造函数的Singleton类。我将使用以下示例来演示 - 第二个类只是一个完整性检查,以确保问题不是特定于静态对象:

#include <Rcpp.h> 

class Singleton {
public:
    static Singleton& get() {
        static Singleton s;
        return s;
    }

    void method() const {
        Rcpp::Rcout << "...\n";
    }

private:
    Singleton() {};
    Singleton(const Singleton&);
    void operator=(const Singleton&);
};

class NonStatic {
public:
    void method() {
        Rcpp::Rcout << "...\n";
    }

private:
    NonStatic() {}
    NonStatic(const NonStatic&);
    void operator=(const NonStatic&);

};

using namespace Rcpp;

RCPP_MODULE(Singleton) {

    class_<Singleton>("Singleton")
    .method("method", &Singleton::method)
    ;

    class_<NonStatic>("NonStatic")
    .method("method", &NonStatic::method)
    ;
}

使用sourceCpp进行编译并尝试调用$method()会导致我的会话崩溃。如果您在* nix机器上,可以通过从R --debugger=gdb(或您选择的调试器)的终端启动R来调查此问题。

nathan@nathan-laptop:~/tmp$ R --debugger=gdb 
## [omitted] 
Reading symbols from /usr/lib/R/bin/exec/R...(no debugging symbols found)...done.
(gdb) R
## [omitted] 
R> Rcpp::sourceCpp("singleton.cpp")
[Thread 0x7ffff13fd700 (LWP 18644) exited]
[Thread 0x7ffff3bfe700 (LWP 18643) exited]
[Thread 0x7ffff43ff700 (LWP 18642) exited]
R> ls()
[1] "NonStatic" "Singleton"
R> x <- new(Singleton)
R> x$method()
terminate called after throwing an instance of 'Rcpp::not_initialized'
  what():  C++ object not initialized (missing default constructor?)

Program received signal SIGABRT, Aborted. 

同样适用于其他班级:

R> Rcpp::sourceCpp("singleton.cpp")
[Thread 0x7ffff13fd700 (LWP 18737) exited]
[Thread 0x7ffff3bfe700 (LWP 18736) exited]
[Thread 0x7ffff43ff700 (LWP 18735) exited]
R> x <- new(NonStatic)
R> x$method()
terminate called after throwing an instance of 'Rcpp::not_initialized'
  what():  C++ object not initialized (missing default constructor?)

Program received signal SIGABRT, Aborted.