[Rcpp-devel] R_PreserveObject and R_ReleaseObject

Simon Dirmeier simon.dirmeier at web.de
Thu Aug 16 15:20:33 CEST 2018


Thanks, Dirk. I am just trying to understand how R works under the 
surface :/.
Correct me where I am wrong please: if I have another method called 
/get/, then I would need to preserve the objects like I did until it is 
removed from the map?

template<typename T>
class map
{
public:

    // as before

    SEXP get(T& t)
     {
         return Rcpp::wrap(map_[t]);
     }

private:
     std::unordered_map<T, SEXP> map_;
};

Best,
Simon

Am 16.08.18 um 14:00 schrieb Dirk Eddelbuettel:
> 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
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20180816/3383f2f5/attachment.html>


More information about the Rcpp-devel mailing list