[Rcpp-devel] R_PreserveObject and R_ReleaseObject

Dirk Eddelbuettel edd at debian.org
Thu Aug 16 14:00:47 CEST 2018


On 16 August 2018 at 10:10, Simon Dirmeier wrote:
| Dear all,
| 
| I have a question about /R_PreserveObject /and/R_ReleaseObject 
| /and//thought this would be good place to post it.
| I apologize if the question is not suitable or naive.

This is the place.
 
| Suppose I have something like the class below for which I use 
| Rcpp-modules to extend it to R (code not shown).
| I use "insert" to add key-value pair to a map and "remove" to remove an 
| entry.
| 
| I am not having memory issues or so, but the solution seems wrong to me

I would agree. You are using a Standard Template Type; these manage their memory.

The two functions you found are R internals for setting reference counters on
SEXP objects. Think of them as 'free floating' objects -- the ones we receive
from R or return to R. Yours is not one of those, and that it may contain
SEXP does not matter as you do not seem to return these SEXPs to R.  If you
did then you would have do that.

And even then you should not need to as Rcpp maps every R with one of our
classes.  These have now about 10 years of testing behind and _work_.  So why
not take advantage of that?

Of course, this is C so if you know what you are doing, you can whatever you
want.  But then you would not need to ask this question :)

Dirk

| and I am concerned that it causes problems.
| Could you please give me some advice if this implementation is wrong or 
| unefficient?
| 
| Thank you in advance.
| Best,
| Simon
| 
| template<typename T>
| class map
| {
| public:
|      map() = default;
| 
|      size_t size()
|      {
|          return map_.size();
|      }
| 
|      void insert(T& t, SEXP u)
|      {
|          SEXP s = Rf_duplicate(VECTOR_ELT(u, i));
|          R_PreserveObject(s);
| 
|          map_.insert(std::pair<T, SEXP>(t[i], s));
|      }
| 
|      void remove(T& t)
|      {
|              auto iter = map_.equal_range(t);
|              for (auto it = iter.first; it != iter.second; ++it)
|              {
|                  R_ReleaseObject(it->second);
|              }
|              map_.erase(t);
|      }
| 
| private:
|      std::unordered_map<T, SEXP> map_;
| };
| 
| 
| 
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

-- 
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org


More information about the Rcpp-devel mailing list