我们正在尝试在R包中使用单例范例。独立测试C ++代码时,我们不会遇到任何问题或错误。当与Rcpp集成到R中时,除了" R已经崩溃之外,它没有输出崩溃。"我们受过良好教育的猜测指向了记忆问题。我们已经尝试将单例暴露给Rcpp并将其隐藏在不同的暴露类中,并且两次都没有输出崩溃。
然后我们尝试运行一个涉及使用单例范例的类的独立函数,并仅打印出有关该类的一些信息。我们成功运行了一个函数,但第二次运行总是打印坏值。
是否可以使用单例范例与Rcpp?
编辑:我们正在使用Rcpp模块。
答案 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.