[R] error() and C++ destructors
Lennart.Borgman@astrazeneca.com
Lennart.Borgman at astrazeneca.com
Tue Mar 9 13:59:01 CET 2004
And maybe I stressed Erik a bit, because he corrected himself some minutes
later (when I was no longer looking over his shoulder). Again on behalf of
Erik.
- Lennart
-----Original Message-----
From: Källen, Erik
Sent: 9 mars 2004 13:40
To: Borgman, Lennart
Subject: RE: [R] error() and C++ destructors
Whoops.
This code leaks memory for the exception.
It would be better to throw a pointer:
void my_error(const string &str) {
throw new error_exception(str);
}
int my_method(int a, char *b) {
try {
return real_my_method(a, b);
}
catch (error_exception *pe) {
static char error_msg[SOME_LARGE_NUMBER];
strncpy(error_msg, pe->msg.c_str(), sizeof(error_msg));
delete pe;
error(error_msg);
}
}
-----Original Message-----
From: Borgman, Lennart
Sent: 9 mars 2004 13:35
To: 'r-help at stat.math.ethz.ch'
Subject: RE: [R] error() and C++ destructors
I am sending this reply on behalf of Erik (who is not a member of this
list).
- Lennart
-----Original Message-----
From: Källen, Erik
Sent: 9 mars 2004 11:37
To: Borgman, Lennart
Subject: RE: [R] error() and C++ destructors
I would do something like:
class error_exception {
public:
error_exception(const string &str) : msg(str) {}
string msg;
};
void my_error(const string &str) {
throw error_exception(str);
}
int real_my_method(int a, char *b) {
/*
some code...
*/
return 0;
}
// this is the public method:
int my_method(int a, char *b) {
try {
return real_my_method(a, b);
}
catch (error_exception &e) {
error(e.msg);
}
}
You could probably even create a macro like:
#define R_METHOD_IMPL(rettype, name, paramlist) \
rettype real_##name paramlist; \
rettype name paramlist { \
try { \
return real_##name paramlist; \
} \
catch (error_exception &e) { \
error(e.msg); \
} \
} \
rettype real_##name paramlist
You would use this macro like:
R_METHOD_IMPL(int, my_method, (int a, char *b)) {
// source code here
}
I think it would work, but I'm not sure (untested).
/Erik Källén
-----Original Message-----
From: Vadim Ogranovich [mailto:vograno at evafunds.com]
Sent: 2 mars 2004 22:00
To: R Help List
Subject: [R] error() and C++ destructors
Hi,
I am writing C++ functions that are to be called via .Call() interface.
I'd been using error() (from R.h) to return to R if there is an error,
but then I realized that this might be not safe as supposedly error()
doesn't throw an exception and therefore some destructors do not get
called and some memory may leak. Here is a simple example
extern "C" void foo() {
string str = "hello";
error("message");
}
The memory allocated for str is leaked.
Did anyone think about this and find a way to work around the problem?
Thanks,
Vadim
[[alternative HTML version deleted]]
______________________________________________
R-help at stat.math.ethz.ch mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide!
http://www.R-project.org/posting-guide.html
More information about the R-help
mailing list