-
January 25th, 2010, 10:50 AM
#1
memory leaks
Hi,
do you think the following code could lead to memory leaks?
Code:
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <boost/circular_buffer.hpp>
using namespace std;
using namespace boost;
char * getDateTime(void);
const short numbuff = 5;
const short buflen = 30;
typedef struct
{
unsigned char * pData;
unsigned short bufferLength;
unsigned short bytesRecorded;
bool flag;
} Buffer;
int main()
{
circular_buffer<Buffer*> cb(numbuff);
circular_buffer<Buffer*>::const_iterator it;
// fill buffer
for(int i = 0; i<numbuff; i++)
{
// set up buffer
Buffer *buff = new Buffer;
ZeroMemory(buff, sizeof(Buffer));
buff->bufferLength = buflen;
buff->bytesRecorded = buflen;
buff->flag = true;
buff->pData = new unsigned char[buflen];
buff->pData = reinterpret_cast<unsigned char *>(getDateTime());
// push buffer
cb.push_back(buff);
Sleep(1000);
}
// show elements
for(int i = 0; i<(int)cb.size(); i++)
{
printf("%s\n", cb[i]->pData);
}
system("pause");
return EXIT_SUCCESS;
}
// getDateTime (Fri, 10 Oct 2008 14:41:59 GMT)
char * getDateTime(void)
{
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = gmtime(&rawtime);
char * buffer = new char[30];
strftime(buffer,30,"%a, %d %b %Y %X GMT",timeinfo);
return buffer;
}
I cannot delete "buff" since its scope is inside the first for loop...
-
January 25th, 2010, 11:06 AM
#2
Re: memory leaks
Hi,
do you think the following code could lead to memory leaks? it creates a
circualr buffer made up of 5 element then it pushes 10 elements (overwriting
the first 5) when overwriting , do you think the eldest pointed memory will
be overwritten, or a new pointer in memory will be written?
Code:
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <boost/circular_buffer.hpp>
using namespace std;
using namespace boost;
char * getDateTime(void);
const short numbuff = 5;
const short buflen = 30;
typedef struct
{
unsigned char * pData;
unsigned short bufferLength;
unsigned short bytesRecorded;
bool flag;
} Buffer;
int main()
{
circular_buffer<Buffer*> cb(numbuff);
circular_buffer<Buffer*>::const_iterator it;
printf("Push elements:\n");
// fill buffer
for(int i = 0; i<10; i++)
{
// set up buffer
Buffer *buff = new Buffer;
ZeroMemory(buff, sizeof(Buffer));
buff->bufferLength = buflen;
buff->bytesRecorded = buflen;
buff->flag = true;
buff->pData = new unsigned char[buflen];
buff->pData = reinterpret_cast<unsigned char *>(getDateTime());
printf("%s\n", buff->pData);
// push buffer
cb.push_back(buff);
Sleep(1000);
}
printf("\nShow elements:\n");
// show elements
for(int i = 0; i<static_cast<int>(cb.size()); i++)
{
printf("%s\n", cb[i]->pData);
}
system("pause");
return EXIT_SUCCESS;
}
// getDateTime (Fri, 10 Oct 2008 14:41:59 GMT)
char * getDateTime(void)
{
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = gmtime(&rawtime);
char * buffer = new char[30];
strftime(buffer,30,"%a, %d %b %Y %X GMT",timeinfo);
return buffer;
}
// thanks
-
January 25th, 2010, 11:15 AM
#3
Re: memory leaks
buff->pData = new unsigned char[buflen];
buff->pData = reinterpret_cast<unsigned char *>(getDateTime());
This leaks. pData is overwritten the 2nd time so the memory you created the 1st time is gone.
Also... who frees the memory that 'getDateTime' has created.
-
January 25th, 2010, 11:24 AM
#4
Re: memory leaks
Originally Posted by Skizmo
This leaks. pData is overwritten the 2nd time so the memory you created the 1st time is gone.
Also... who frees the memory that 'getDateTime' has created.
by the way, how can I change getDateTime() to return char[30] ?? I mean the return type...
thanks
-
January 25th, 2010, 11:29 AM
#5
Re: memory leaks
Originally Posted by THEARTOFWEB
by the way, how can I change getDateTime() to return char[30] ?? I mean the return type...
thanks
For example:
Code:
void getDateTime( char *buffer)
{
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = gmtime(&rawtime);
strftime(buffer,30,"%a, %d %b %Y %X GMT",timeinfo);
}
Now you can:
Code:
char buffer[30];
getDateTime(buffer);
Victor Nijegorodov
-
January 25th, 2010, 11:20 AM
#6
Re: memory leaks
All that you newed you *must* delete. Period.
If you don't delete what you have newed then you produce memory leaks.
Victor Nijegorodov
-
January 25th, 2010, 11:25 AM
#7
Re: memory leaks
Originally Posted by VictorN
All that you newed you *must* delete. Period.
If you don't delete what you have newed then you produce memory leaks.
Ok. As I was suggested in this very forum...I am going to use vector to collect chars...is that ok? and no pointers anymore...
-
January 25th, 2010, 11:30 AM
#8
Re: memory leaks
Originally Posted by THEARTOFWEB
...I am going to use vector to collect chars...is that ok? and no pointers anymore...
Yes, it is definetly a very good idea!
Victor Nijegorodov
-
January 25th, 2010, 11:48 AM
#9
Re: memory leaks
For instance...do you think the following could be better approach?
Code:
struct Buffer
{
public:
vector<unsigned char> vChar;
unsigned int bufferLength;
unsigned int bytesRecorded;
Buffer() : bytesRecorded(0), bufferLength(0), vChar(NULL) { };
};
int main()
{
circular_buffer<Buffer> cb(numbuff);
circular_buffer<Buffer>::const_iterator it;
(...)
}
thanks
-
January 25th, 2010, 02:21 PM
#10
Re: memory leaks
No memory leaks that I see, but certainly undefined behavior as your "char szTime" goes out of scope when your for loop finishes.
Why not declare your "struct Buffer" with a fixed size "payload":
Code:
struct Buffer
{
public:
char payload[30];
int bufferLength;
int bytesRecorded;
int user;
Buffer() : bytesRecorded(0), bufferLength(0), user(0), payload(NULL) { };
};
Edit: remove the "payload(NULL)" form your constructor too.
Last edited by hoxsiew; January 25th, 2010 at 02:23 PM.
Reason: update
-
January 25th, 2010, 02:36 PM
#11
Re: memory leaks
Ok, so all I can do is the following:
Code:
#include <windows.h>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <boost/circular_buffer.hpp>
using namespace std;
using namespace boost;
void getDateTime(char * szTime);
const int numbuff = 3;
const int buflen = 30;
struct Buffer
{
public:
char payload[30];
int bufferLength;
int bytesRecorded;
int user;
Buffer() : bufferLength(0), bytesRecorded(0), user(0) { }
};
int main()
{
circular_buffer<Buffer> cb(numbuff);
// Insert elements
printf("Push elements:\n");
for(int i = 0; i<5; i++)
{
// Get time
char szTime[30]; getDateTime(szTime);
// Init Buff
Buffer buff;
ZeroMemory(&buff, sizeof(Buffer));
memcpy((void*)buff.payload, szTime, buflen);
buff.user = i;
buff.bufferLength = buflen;
buff.bytesRecorded = buflen;
cb.push_back(buff);
printf("%s\n", buff.payload);
Sleep(1000);
}
// Show elements:
printf("Show elements:\n");
for(int i = 0; i<(int)cb.size(); i++)
{
printf("%s\n", cb[i].payload);
}
system("pause");
return EXIT_SUCCESS;
}
void getDateTime(char * szTime)
{
time_t rawtime = time(NULL);
struct tm timeinfo;
gmtime_s(&timeinfo, &rawtime);
strftime(szTime, 30, "%a, %d %b %Y %X GMT", &timeinfo);
}
so I will set payload to contains a loto of chars like:
then if payload is less the 4096 bytes long I will zero fill or read only a part of that
-
January 25th, 2010, 03:32 PM
#12
Re: memory leaks
Looks like you aren't taking advantage of c++ at all. this looks like c with classes approach with boost?
Code:
#include <windows.h>
#include <ctime>
#include <string>
#include <iostream>
#include <boost/circular_buffer.hpp>
#include <boost/foreach.hpp>
using namespace std;
using namespace boost;
string getDateTime()
{
time_t rawtime = time(NULL);
tm* timeinfo = gmtime(&rawtime);
char szTime[30];
strftime(szTime, 30, "%a, %d %b %Y %X GMT", timeinfo);
return szTime;
}
struct Buffer
{
string payload;
int user;
Buffer() : payload(), user() { }
Buffer( const string& payload, int user ) : payload(payload), user(user) { }
};
int main()
{
const int numbuff = 3;
circular_buffer<Buffer> cb(numbuff);
// Insert elements
cout << "Push elements:" << endl;
for( int i = 0; i < 5; i++ )
{
cb.push_back( Buffer( getDateTime(), i ) );
Sleep(1000);
}
// Show elements:
cout << "Show elements:" << endl;
BOOST_FOREACH( Buffer Record, cb )
cout << Record.payload << endl;
system("pause");
return 0;
}
This is more c++ than the c approach , but understanding how and why to use string, constructors, containers and etc will take time. If this isn't what you require, just state what is wrong with the above code.
0100 0111 0110 1111 0110 0100 0010 0000 0110 1001 0111 0011 0010 0000 0110 0110 0110 1111 0111 0010
0110 0101 0111 0110 0110 0101 0111 0010 0010 0001 0010 0001 0000 0000 0000 0000 0000 0000 0000 0000
-
January 25th, 2010, 04:06 PM
#13
Re: memory leaks
Originally Posted by Joeman
This is more c++ than the c approach , but understanding how and why to use string, constructors, containers and etc will take time. If this isn't what you require, just state what is wrong with the above code.
I might deal with /char/ (or unsigned char) data returned by some other functions....
I know I could cast to char to string...Yet, I'd like to stick with char for the moment
-
January 25th, 2010, 04:12 PM
#14
Re: memory leaks
I mean, binary string mostly (unsigned char) the getDateTime() is just a way to fill the buffer with something for the moment...in the near future I'll be dealing with binary string only in my application
-
January 25th, 2010, 05:56 PM
#15
Re: memory leaks
Originally Posted by Joeman
This is more c++ than the c approach , but understanding how and why to use string, constructors, containers and etc will take time. If this isn't what you require, just state what is wrong with the above code.
I think for the moment I'll use this:
Code:
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <boost/circular_buffer.hpp>
using namespace std;
using namespace boost;
void getDateTime(char * szTime);
const int numbuff = 3;
const int buflen = 30;
struct cBuffer
{
char data[1024];
int bytesRecorded;
bool flag;
cBuffer(char * data_, int bytesRecorded_, bool flag_) :
bytesRecorded(bytesRecorded_), flag(flag_)
{
memcpy(static_cast<void *>(data), static_cast<void *>(data_), bytesRecorded);
}
};
int main()
{
circular_buffer<cBuffer> cb(numbuff);
// Insert elements
printf("Push elements:\n");
for(int i = 0; i < 5; i++)
{
char szTime[30]; getDateTime(szTime);
cb.push_back(cBuffer(szTime, 30, true));
printf("%s\n", szTime);
Sleep(1000);
}
// Show elements:
printf("Show elements:\n");
for(int i = 0; i<(int)cb.size(); i++)
{
printf("%s\n", cb[i].data);
}
system("pause");
return EXIT_SUCCESS;
}
void getDateTime(char * szTime)
{
time_t rawtime = time(NULL);
struct tm timeinfo;
gmtime_s(&timeinfo, &rawtime);
strftime(szTime, 30, "%a, %d %b %Y %X GMT", &timeinfo);
}
this time I think I won't be having any memory leaks!
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|