473,785 Members | 2,812 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

C++ / JNI memory leakage, help needed

Hi group!

I am using C++ and java with JNI to get some text in a RICHEDIT to my
java program. I do so by accessing a C++ method every second. It all
works fine except that it leaks memory every call I make to the C++
method.

Can anyone please help me with this problem? I am not sure wether the
leakage is in the C++ or java code. But i guess it's on the C++ side
since I'm kind of newbee there.

Is there perhaps a way to release the memory allocated for a LPTSTR in
C++?
Please take a look at the code below, it is the method i call every
second from java. I belive it is the LPTSTR that is leaking, since it
leaks more when the string gets larger.

<---------------
LPTSTR output;

JNIEXPORT jstring JNICALL
Java_JNIHandler _getDealerOutpu t(JNIEnv *env, jobject obj){

size = SendMessage(
(HWND) textarea, // handle to destination window
WM_GETTEXTLENGT H, // message to send
(WPARAM) 0,
(LPARAM) 0 ) +1;

output = new TCHAR[size];

SendMessage(tex tarea,
WM_GETTEXT,
size,
(LPARAM)(void*) output);

return env->NewStringUTF(d ealerStr);

}
------------------>

I have tried to release the memory allocated when the NewStringUTF is
made with the JNI.h method env -> ReleaseStringUT FChars(str,
dealerStr) to no avail.
I hae also tried to use a try/finally block and in the finally set:
output= NULL; delete output; but there is no difference.

Cheers
Andreas
Jul 22 '05
32 4892
John Harrison wrote:
"Sambucus" <an************ ***@aetdata.com > wrote in message
news:d3******** *************** ***@posting.goo gle.com...
Hi group!

I am using C++ and java with JNI to get some text in a RICHEDIT to my
java program. I do so by accessing a C++ method every second. It all
works fine except that it leaks memory every call I make to the C++
method.

Can anyone please help me with this problem? I am not sure wether the
leakage is in the C++ or java code. But i guess it's on the C++ side
since I'm kind of newbee there.

Is there perhaps a way to release the memory allocated for a LPTSTR in
C++?
Please take a look at the code below, it is the method i call every
second from java. I belive it is the LPTSTR that is leaking, since it
leaks more when the string gets larger.

<---------------
LPTSTR output;

JNIEXPORT jstring JNICALL
Java_JNIHandl er_getDealerOut put(JNIEnv *env, jobject obj){

size = SendMessage(
(HWND) textarea, // handle to destination window
WM_GETTEXTLEN GTH, // message to send
(WPARAM) 0,
(LPARAM) 0 ) +1;

output = new TCHAR[size];

SendMessage(t extarea,
WM_GETTEXT,
size,
(LPARAM)(void *)output);

return env->NewStringUTF(d ealerStr);

}
------------------>

I have tried to release the memory allocated when the NewStringUTF is
made with the JNI.h method env -> ReleaseStringUT FChars(str,
dealerStr) to no avail.
I hae also tried to use a try/finally block and in the finally set:
output= NULL; delete output; but there is no difference.

finally is not part of the C++ language

Try this

jstring res = env->NewStringUTF(d ealerStr);
delete[] output;


It's been a while since I last used JNI, but I think that strings that
you create using NewStringUTF must be deleted (I don't remember the
syntax for this).

Check Sun's web site for more details on NewStringUTF...

JLR
Jul 22 '05 #21
Yoyoma_2 wrote:
James Gregory wrote:
[...]
If you alwaise test on NULL then you are fine. What happends if you
need to write to the 0x0 memory area in an albeit wierd platform.


You are wrong. The value 0 when used as a pointer has special defined
semantics in both C and C++. Check the standards for the details.

I'd write more except that:

(a) this is cross-posted into areas where nobody is even slightly interested in
the oddities of the C/C++ standards.

(b) it's a few years since I last attempted public pedantry on these topics, so
I'm a little rusty...

-- chris
Jul 22 '05 #22
Yoyoma_2 wrote:
James Gregory wrote:
[...]
If you alwaise test on NULL then you are fine. What happends if you
need to write to the 0x0 memory area in an albeit wierd platform.


You are wrong. The value 0 when used as a pointer has special defined
semantics in both C and C++. Check the standards for the details.

I'd write more except that:

(a) this is cross-posted into areas where nobody is even slightly interested in
the oddities of the C/C++ standards.

(b) it's a few years since I last attempted public pedantry on these topics, so
I'm a little rusty...

-- chris
Jul 22 '05 #23
James Gregory wrote:
On Sat, 03 Apr 2004 17:07:10 +0000, Yoyoma_2 wrote:

This isn't java related but alwaise set your variables to NULL, since
some platforms could exist that NULL is not defined as 0x0.

I'm sure I've seen someone else on this group before say "Always set your
variables to 0 rather than to NULL, some platforms may exist where NULL
isn't defined as 0".


NULL must be a constant expression equal to 0. There is absolutely no
difference between using NULL and 0.

4.10 Pointer conversions [conv.ptr]

1 A null pointer constant is an integral constant expression
(_expr.const_) rvalue of integer type that evaluates to zero.

18.1 Types [lib.support.typ es]

[...]

4 The macro NULL is an implementation-defined C++ null pointer constant
in this International Standard (_conv.ptr_).18 0)

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.
Jul 22 '05 #24
James Gregory wrote:
On Sat, 03 Apr 2004 17:07:10 +0000, Yoyoma_2 wrote:

This isn't java related but alwaise set your variables to NULL, since
some platforms could exist that NULL is not defined as 0x0.

I'm sure I've seen someone else on this group before say "Always set your
variables to 0 rather than to NULL, some platforms may exist where NULL
isn't defined as 0".


NULL must be a constant expression equal to 0. There is absolutely no
difference between using NULL and 0.

4.10 Pointer conversions [conv.ptr]

1 A null pointer constant is an integral constant expression
(_expr.const_) rvalue of integer type that evaluates to zero.

18.1 Types [lib.support.typ es]

[...]

4 The macro NULL is an implementation-defined C++ null pointer constant
in this International Standard (_conv.ptr_).18 0)

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.
Jul 22 '05 #25
>
finally is not part of the C++ language

Try this

jstring res = env->NewStringUTF(d ealerStr);
delete[] output;
return res;

I guess you are more of a Java programmer than a C++ programmer.

Another method would be to use a vector, then you wouldn't have to worry
about memory allocation.

size = SendMessage(tex tarea, WM_GETTEXTLENGT H, 0, 0);
std::vector<TCH AR> output(size + 1);
SendMessage(tex tarea, WM_GETTEXT, size, (LPARAM)(void*) &output[0]);
return env->NewStringUTF(& output[0]);

I'm a bit hazy on the Windows and JNI details but the bottom line is that if
you allocate memory with new[] then you have to free it with delete[], and
if you use a vector then you don't have to deallocate at all.

john


You are certainly corect about me beeing a Java programer and not C++
;)
I tried the first approach and it worked fine, thank you very much
John!¨

However i had tried to use something like this:

return env->NewStringUTF(o utput);

}
__finally
{
output= NULL;
delete [] output;
size=NULL;

....and it did not work, i guess it has to do with the __finally not
beeing part of c++? but why don't I get compilation a error?

//Andreas
Jul 22 '05 #26
>
finally is not part of the C++ language

Try this

jstring res = env->NewStringUTF(d ealerStr);
delete[] output;
return res;

I guess you are more of a Java programmer than a C++ programmer.

Another method would be to use a vector, then you wouldn't have to worry
about memory allocation.

size = SendMessage(tex tarea, WM_GETTEXTLENGT H, 0, 0);
std::vector<TCH AR> output(size + 1);
SendMessage(tex tarea, WM_GETTEXT, size, (LPARAM)(void*) &output[0]);
return env->NewStringUTF(& output[0]);

I'm a bit hazy on the Windows and JNI details but the bottom line is that if
you allocate memory with new[] then you have to free it with delete[], and
if you use a vector then you don't have to deallocate at all.

john


You are certainly corect about me beeing a Java programer and not C++
;)
I tried the first approach and it worked fine, thank you very much
John!¨

However i had tried to use something like this:

return env->NewStringUTF(o utput);

}
__finally
{
output= NULL;
delete [] output;
size=NULL;

....and it did not work, i guess it has to do with the __finally not
beeing part of c++? but why don't I get compilation a error?

//Andreas
Jul 22 '05 #27
> It's been a while since I last used JNI, but I think that strings that
you create using NewStringUTF must be deleted (I don't remember the
syntax for this).

Check Sun's web site for more details on NewStringUTF...

JLR


Well i stumbled on info regarding this appearantly by Sun undocumented
memory leakage in JNI when trying to solve my problem.

However this is only when you are sending a java String to the C dll.
In the C code you have to get a C string from the Java UTF chars...
then you must use "env -> ReleaseStringUT FChars(str,outp ut)" to
release it
Jul 22 '05 #28
> It's been a while since I last used JNI, but I think that strings that
you create using NewStringUTF must be deleted (I don't remember the
syntax for this).

Check Sun's web site for more details on NewStringUTF...

JLR


Well i stumbled on info regarding this appearantly by Sun undocumented
memory leakage in JNI when trying to solve my problem.

However this is only when you are sending a java String to the C dll.
In the C code you have to get a C string from the Java UTF chars...
then you must use "env -> ReleaseStringUT FChars(str,outp ut)" to
release it
Jul 22 '05 #29
lev
function c_str() returns const <CHAR_TYPE> *
"John Harrison" <jo************ *@hotmail.com> wrote in message
news:c4******** *****@ID-196037.news.uni-berlin.de...

What John said, but consider using a std::basic_stri ng<TCHAR> instead of
std::vector<TCH AR>. The basic string in C++ has more Java-like syntax,
e.g. the operator [ ] is range-checked, and concatenation can be done
with operator +.
But the problem with std::basic_stri ng is that you cannot get a writable
pointer from it. Therefore it's not suitable for passing to

SendMessage(win , WM_GETTEXT ...).

john

Jul 22 '05 #30

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
3736
by: frustrated | last post by:
Before I begin, I must first make the following disclaimer: Although I have considerable programming experience, I do not consider myself by any means to be an expert C++ programmer. The following may be nothing more than a relection of my ignorance. If what I describe is not an actual bug, I would be very appreciative if you could briefly explain to me how I can de-allocate memory allocated by a set class, since everything I have tried is...
2
1223
by: Sambucus | last post by:
Hi group! I am using C++ and java with JNI to get some text in a RICHEDIT to my java program. I do so by accessing a C++ method every second. It all works fine except that it leaks memory every call I make to the C++ method. Can anyone please help me with this problem? I am not sure wether the leakage is in the C++ or java code. But i guess it's on the C++ side since I'm kind of newbee there.
7
1778
by: andylcx | last post by:
hi all: I have a code like below, is there any serious memory leakage in my code. I am confusion now but no idea how to fix it. In the member function of class A, I create a new object of class B like below: void A::function() { B *newobject = new B; newobject->....; newobject->....; //did some action here
10
2782
by: s.subbarayan | last post by:
Dear all, I happen to come across this exciting inspiring article regarding memory leaks in this website: http://www.embedded.com/story/OEG20020222S0026 In this article the author mentions: "At a certain point in the code you may be unsure if a particular block is no longer needed. If you free() this piece of memory, but continue to access it (probably via a second pointer to the same
18
2274
by: Ramasubbu Ramasubramanian XR (AS/EAB) | last post by:
What is memory leakage, could any one explain with sample code
4
2305
by: NewToCPP | last post by:
Is there any debugging mechanism to find out which part of the code is causing memory leak?
0
1370
by: kiran kumar | last post by:
Hi All, I am working on embedded python on C these days. I feel there is a memory leakage in this code. I have used our own memory pool and all the python code will use the heap from this memory pool. RunScript(pScriptName,pFuncName,...) { PyEval_AcquireLock() threadState = Py_NewInterpreter(); PyThreadState_Swap(threadState);
14
2349
by: madhawi | last post by:
i want to know that on what situation memory leakage happan and what is the solution to solve the problem of memory leakage.
27
2968
by: George2 | last post by:
Hello everyone, Should I delete memory pointed by pointer a if there is bad_alloc when allocating memory in memory pointed by pointer b? I am not sure whether there will be memory leak if I do not delete a. try { a = new int ;
11
2308
by: prpradip | last post by:
I have an ImageList (_imageList). In _imageList I have put large numbers of Icons. Now what I need is to get Handle of all Icons that I put in _imageList, so that I can destroy (DestoryIcon) them all and release the memory because it's causing Memory leakage.
0
9645
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
10324
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
1
10090
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
8971
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
6739
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5380
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5511
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
4050
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
3645
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.