2016-04-30 68 views
1

我們試圖在R包中使用單例模式。單獨測試C++代碼時,我們不會遇到任何問題或錯誤。當與Rcpp集成到R時,除了「R已經崩潰」之外,它會崩潰而沒有輸出。我們受過教育的猜測指向記憶問題。我們已經嘗試將單例暴露給Rcpp並將其隱藏在不同的暴露類中,並且這兩次崩潰都沒有輸出。我可以在RCpp中使用單例模式嗎?

然後,我們嘗試運行一個涉及使用單例範例的類的獨立函數,並僅打印出關於類的一些信息。我們成功運行了一個函數,但第二次運行總是打印出錯誤的值。

是否有可能使用單例模式與Rcpp?

編輯:我們正在使用Rcpp模塊。

+0

只是稍微注意一下:它是模式,而不是範式:) – Incomputable

+0

的[頁碼](http://dirk.eddelbuettel.com/code/ rcpp.html)表示,如果您使用Rcpp :: wrap,那麼您使用的類應該可以隱式轉換爲SEXP。但如果它使用tmp,那麼可能會出現編譯錯誤。如果這沒有幫助,那麼可能從外部(另一個構造函數參數,函數參數)或內部(受保護的成員)的變化導致錯誤。 – Incomputable

+2

代碼會有幫助。 – hrbrmstr

回答

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來調查此問題。

[email protected]:~/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. 
相關問題