c ++全局变量导致段错误

时间:2013-11-28 12:57:30

标签: r rcpp

我正在努力将一些用c ++编写的MCMC软件转换为使用Rcpp和模块的R-package。在这方面,我需要维护一个全局变量指针,并指向构造的某个类的最新对象。

以下是R脚本形式的一个非常简单的示例:

require(Rcpp)
require(inline)

inc <- '

using namespace Rcpp;

class test;
test* glob; //global pointer


class test{
  private: 
    double foo;
  public:
    test(double foo_) : foo(foo_) {
      glob=this; // the line causes segfault
    }; 
    double get_foo(){return foo;};
};

RCPP_MODULE(test){
  class_<test>("test")
  .constructor<double>()
  .property("foo",&test::get_foo)
  ;

}

'

fx <- cxxfunction(signature(),plugin="Rcpp",include=inc);
test_module <- Module("test",getDynLib(fx))
test <- test_module$test
t1 <- new(test,1.0)

我想要的是以下内容(在c ++中):

#include<iostream>

class test;
test* glob;


class test{
  private: 
    double foo;
  public:
    test(double foo_) : foo(foo_) {glob=this;};
    double get_foo(){return foo;};
};

int main(){
  test t1(1.0);
  test t2(2.0);
  std::cout << (*glob).get_foo() << std::endl;
}

编译并按预期运行。

提前致谢, 此致,Tore Kleppe

1 个答案:

答案 0 :(得分:2)

这似乎是两个无关且简单的错误。

首先,你需要制作指针static。事情随后起作用。

其次,使用带有inline的Rcpp模块是否定的 更简单的方式,我们通常建议使用包 - 或Rcpp属性,如下所示。

更正代码,包括在构造函数中向stdout显式发送消息:

#include <Rcpp.h>

using namespace Rcpp;

class test;
static test* glob = NULL; //global pointer


class test{
  private: 
    double foo;
  public:
    test(double foo_) : foo(foo_) {
      Rcpp::Rcout << "Seeing foo_ of " << foo_ << " in ctor\n";
      glob=this; // the line causes segfault
    }; 
    double get_foo(){return foo;};
};

RCPP_MODULE(test){
  class_<test>("test")
  .constructor<double>()
  .property("foo",&test::get_foo)
  ;
}

然后从命令行中简单使用(使用littler; R或Rscript是等效的):

$ r -lRcpp -e 'sourceCpp("/tmp/tore.cpp"); tt <- new(test, 1.23); print(tt$foo)'
Seeing foo_ of 1.23 in ctor
[1] 1.23
$ 

请注意我们如何跳过所有模块实例化等。