473,320 Members | 1,820 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,320 software developers and data experts.

Memory allocation problem

Hello,

I noticed that when I dynamically create an array of chars, the
resulting size of the allocated memory block is larger by about 15
bytes than what I specified. Here is example code:

char *createTextBuffer(char *buffer, int length)
{
buffer = new char[length];

if (buffer == NULL) {
return NULL;
}
length = strlen(buffer); // Current buffer shows larger size.
return buffer;
}

The above program causes a crash when destroying the allocated memory
via delete. I suspect the crash problem originates at the time of
allocation (i.e., possible memory corruption at time of allocation).

I am using MS Developer Studio 6.0 (SP 6) on AMD Athlon. I get the same
results on a Pentium 4. Any suggestions or comments on what I am doing
in the code is much appreciated.

TIA
Alabi

Dec 17 '05 #1
10 4319
AlabiChin napisa³:
Hello,

I noticed that when I dynamically create an array of chars, the
resulting size of the allocated memory block is larger by about 15
bytes than what I specified. Here is example code:

char *createTextBuffer(char *buffer, int length)
{
buffer = new char[length];

if (buffer == NULL) {
return NULL;
// new does not return NULL on error, it throws
// so this check is meaningless
}
length = strlen(buffer); // Current buffer shows larger size.
return buffer;
}

The above program causes a crash when destroying the allocated memory
via delete.
That's because you should destroy it using 'delete[]',
not 'delete'.
I suspect the crash problem originates at the time of
allocation (i.e., possible memory corruption at time of allocation).
I don't think so.

I am using MS Developer Studio 6.0 (SP 6) on AMD Athlon. I get the same
results on a Pentium 4. Any suggestions or comments on what I am doing
in the code is much appreciated.


Notice that you don't clear the allocated buffer, therefore
it contains garbage. The function strlen() looks for the
first occurrence of the '\0' terminator, which luckily
falls 'about 15 bytes' after the end of your buffer.

HTH,
- J.
Dec 17 '05 #2
AlabiChin wrote:
Hello,

I noticed that when I dynamically create an array of chars, the
resulting size of the allocated memory block is larger by about 15
bytes than what I specified. Here is example code:

char *createTextBuffer(char *buffer, int length)
{
buffer = new char[length];

if (buffer == NULL) {
This check is unnecessary. new either returns a valid pointer or (if no
memory is available) throws an exception. It never returns a null pointer.
return NULL;
}
length = strlen(buffer); // Current buffer shows larger size.
return buffer;
}
strlen expects a C style string, i.e. a null terminated character array. You
gave it uninitialized memory, which means the behavior is undefined.
The above program causes a crash when destroying the allocated memory
via delete. I suspect the crash problem originates at the time of
allocation (i.e., possible memory corruption at time of allocation).


No, it originates at the time you used strlen on it. Probably, strlen went
past the end of the array to find the null character.

Dec 17 '05 #3
AlabiChin wrote:
Hello,

I noticed that when I dynamically create an array of chars, the
resulting size of the allocated memory block is larger by about 15
bytes than what I specified. Here is example code:

char *createTextBuffer(char *buffer, int length)
{
buffer = new char[length];

if (buffer == NULL) {
return NULL;
}
length = strlen(buffer); // Current buffer shows larger size.
return buffer;
}

The above program causes a crash when destroying the allocated memory
via delete. I suspect the crash problem originates at the time of
allocation (i.e., possible memory corruption at time of allocation).

I am using MS Developer Studio 6.0 (SP 6) on AMD Athlon. I get the same
results on a Pentium 4. Any suggestions or comments on what I am doing
in the code is much appreciated.

TIA
Alabi


You have an uninitialized buffer. Calling strlen with such a buffer is
likely to cause a crash right then and there. strlen does not return
the length of the buffer, it returns the length of a nul-terminated
string that has been stored in the buffer. But you do not have such a
string in the buffer.

--
Scott McPhillips [VC++ MVP]

Dec 17 '05 #4
AlabiChin wrote:
I noticed that when I dynamically create an array of chars, the
resulting size of the allocated memory block is larger by about 15
bytes than what I specified.
whilst "new" can be expected to allocate a few more bytes than
requested
(housekeeping) 15 bytes sounds like a lot.

Here is example code:

char *createTextBuffer(char *buffer, int length)
{
buffer = new char[length];

if (buffer == NULL) {
return NULL;
}
length = strlen(buffer); // Current buffer shows larger size.
you can't do strlen on a newly allocated chunk of memory. How do you
know
"new" returns a nul terminated string?
return buffer;
}

The above program causes a crash when destroying the allocated memory
via delete.
what does your delete look like?

I suspect the crash problem originates at the time of
allocation (i.e., possible memory corruption at time of allocation).
I suspect there's something else wrong with your program. Standard
libraries
can have bugs, but always suspect your own (newly written) code first
I am using MS Developer Studio 6.0 (SP 6) on AMD Athlon. I get the same
results on a Pentium 4. Any suggestions or comments on what I am doing
in the code is much appreciated.

--
Nick Keighley

Dec 17 '05 #5
AlabiChin wrote:
Hello,

I noticed that when I dynamically create an array of chars, the
resulting size of the allocated memory block is larger by about 15
bytes than what I specified. Here is example code:

char *createTextBuffer(char *buffer, int length)
{
buffer = new char[length];

if (buffer == NULL) {
return NULL;
}
length = strlen(buffer); // Current buffer shows larger size.
return buffer;
}
strlen is a "C" library function which returns the length of a "null
terminated string". In other words, in the current case, it will count
the number of characters from start of buffer till it finds a null
character. Since char is a basic data type, buffer remains
uninitialized, and thus contains a junk. It is incorrect to relie on
strlen.

The above program causes a crash when destroying the allocated memory
via delete.

This is because usage of new[] must be matched via delete[], not
delete.

Dec 17 '05 #6

"AlabiChin" <al**********@yahoo.com> wrote in message
news:11**********************@g47g2000cwa.googlegr oups.com...
Hello,

I noticed that when I dynamically create an array of chars, the
resulting size of the allocated memory block is larger by about 15
bytes than what I specified. Here is example code:

char *createTextBuffer(char *buffer, int length)
{
buffer = new char[length];

if (buffer == NULL) {
return NULL;
}
length = strlen(buffer); // Current buffer shows larger size.


strlen looks for the first null character to determine the end of the
string. Since you have not initialized the array, the array contains random
information, and your length will be some arbitary number.

To see this add this line just before your length =

buffer[0] = '\0';

Now your length will be 0 because it will find the null in the first
position.

When you delete this array you use delete[]
Dec 17 '05 #7
Hmm, I studied documentation in VS 2003.NET which I consider not too
out-of-date and found out that new returns 0/NULL. If you want exception
handling you need to use set_new_handler function.
From what time new throws exception? What type of exception is it?
Dec 17 '05 #8
Viktor Prehnal wrote:
Hmm, I studied documentation in VS 2003.NET which I consider not too
out-of-date and found out that new returns 0/NULL. If you want exception
handling you need to use set_new_handler function.
new throws an exception when it fails
From what time new throws exception? What type of exception is it?


std::bad_alloc
--
Nick Keighley

Dec 17 '05 #9
Viktor Prehnal wrote:
Hmm, I studied documentation in VS 2003.NET which I consider not too
out-of-date and found out that new returns 0/NULL. If you want exception
handling you need to use set_new_handler function.
From what time new throws exception?
In Standard C++ (which is existing since 1998), this has always been the
case.
What type of exception is it?


std::bad_alloc

Dec 18 '05 #10
AlabiChin wrote:
I noticed that when I dynamically create an array of chars
Why would you want to do that?
the resulting size of the allocated memory block
is larger by about 15 bytes than what I specified.
Why would you care?
Here is example code:

char *createTextBuffer(char *buffer, int length)
{
buffer = new char[length];

if (buffer == NULL) {
return NULL;
}
length = strlen(buffer); // Current buffer shows larger size.
return buffer;
}

Yuck!
Here's my version of your code:

{ // Begin block; stuff declared in here dies at end.

// Make a buffer to hold some text:
std::string TextBuffer = "This is some text.";

// Find the length of the text in the buffer, which is
// NOT the same thing as the memory used by the buffer:
int Length = TextBuffer.size();

// (do stuff with TextBuffer and Size)

} // End block; TextBuffer and Size are deallocated here.

In my version, allocation and deallocation are always done
for you automatically. There is no "memory allocation
problem". If you absolutely need a C string version of
TextBuffer (say, to pass to some C std lib function), then
use the .c_str() member function of TextBuffer:

int CSize = strlen(TextBuffer.c_str());

I think you'll find that Size and CSize are then both
equal to 18 (the length of "This is some text.").
The above program causes a crash.


Of course. For one thing, it's full of errors, as others
here have pointed out. But more importantly, it's C, not
C++. A zero-terminated array of char is a very antiquated
and crude way of handling strings. C++ std::string is much
better. It's easier, safer, and much more versatile, with
loads of cool member functions such as "size" and "find"
and "substr". Time to upgrade your approach, I think.

--
Cheers!
Robbie Hatley
Tustin, CA, USA
email: lonewolfintj at pacbell dot net
web: home dot pacbell dot net slant earnur slant
Dec 18 '05 #11

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

Similar topics

4
by: Franklin Lee | last post by:
Hi All, I use new to allocate some memory,even I doesn't use delete to release them. When my Application exit, OS will release them. Am I right? If I'm right, how about Thread especally on...
4
by: PaulR | last post by:
Hi, We have a Server running SLES 8 and 3GB memory, with 1 DB2 instance and 2 active Databases. General info... DB2level = "DB2 v8.1.0.72", "s040914", "MI00086", and FixPak "7" uname -a =...
15
by: berthelot samuel | last post by:
Hi, I'm trying to develop an application for modeling 3D objects from Bezier patches, but I have a memory allocation problem. Here are my structures: typedef struct _vector3 { union { struct...
7
by: Dan Nilsen | last post by:
Hi! I'm writing a small piece of software that basically runs on an embedded system with a Power-PC cpu. This runs on a stripped down version of Linux - Busybox. As I'm writing a piece of...
3
by: Florin | last post by:
Hi all, I have a problem related to memory grow on a server application which is basically stateless (I have some static info loaded). The client accesses this server using remoting and it has...
74
by: ballpointpenthief | last post by:
If I have malloc()'ed a pointer and want to read from it as if it were an array, I need to know that I won't be reading past the last index. If this is a pointer to a pointer, a common technique...
66
by: Johan Tibell | last post by:
I've written a piece of code that uses sockets a lot (I know that sockets aren't portable C, this is not a question about sockets per se). Much of my code ended up looking like this: if...
1
by: Peterwkc | last post by:
Hello all expert, i have two program which make me desperate bu after i have noticed the forum, my future is become brightness back. By the way, my problem is like this i the first program was...
34
by: jacob navia | last post by:
Suppose that you have a module that always allocates memory without ever releasing it because the guy that wrote it was lazy, as lazy as me. Now, you want to reuse it in a loop. What do you do?...
9
by: Steven Powers | last post by:
Imagine the following setup class Parent { virtual void doStuff(); } class Child : public Parent { virtual void doStuff(); }
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...

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.