Re: Newbie: out of memory issues
<trx32@mchsi.com> ha scritto nel messaggio
news:rp0ra4pjsu7l26mc3amehb2abfqu4th8ls@4ax.com...
Yes ,
Heres the problem code:: Lots of array handling with objects..
I'm sure there's a better way to init arrays of strings(below).
OK Tony.
First thing: please get rid of raw C char*/TCHAR* strings, and use a robust
string class (like CString or std::wstring).
And please use an array container class like std::vector or CArray, not raw
C array.
I believe that most of the problems and bugs in today C++ code are caused by
the fact that some programmers use C++ as a "renamed C" (i.e. they use only
1% of C++), instead of correctly using robust tools that C++ offers, like
container classes, string classes, RAII, etc. that make the programmer's
life easier.
int CMyFx::Calc_Charts_And_Houses(CChart Chart1,int intCht)
Maybe you should pass CChar as a const reference (const &) here, to avoid
copy constructors calls and deep-copy.
...Calc_Charts_And_Houses( const CChart & Chart1, int intCht )
(Note that VB.NET passes class instances using references [i.e. kind of
pointers] "under the scene"; instead, in C++, you must make that reference
passing explicit.)
{
double X[6] = {0,0,0,0,0,0};
double Y[6] = {0,0,0,0,0,0};
double cusp[13];
double ascmc[10];
int cal = 103;
string ss(16,' ');
char out1[31];
char out2[31];
char out3[31];
I would really use some array container, like std::vector, e.g.
std::vector< double > X( 6 );
std::vector< double > cusp( 13 );
...
If your char arrays are strings, use a string class:
CString out1;
CString out2;
CString out3;
Using array and string classes help you avoid dangerous buffer overruns
(security enemy #1), and memory leaks (because these classes have
destructors that do proper cleanup of resources).
char* strErr;
//CString strErr;
char* strPlname;
strErr = new char[256];
strPlname = new char[21];
Just use CString/std::wstring:
CString strErr;
CString strPIname;
strErr = _T("... some error..." );
Or better load error string from resources, e.g. strErr.LoadString(
IDS_SOME_ERROR_MESSAGE );
strPlname = TrimRight(strPlname, ' ');
CString class has methods for trimming, that are better than using an
external function.
N2Planets[intX].dbDeclination = Y[1];
strcpy(out1,strPlname);
If you use a CString class, you don't need dangerous strcpy (which -
moreover - is not correct for Unicode).
Just:
CString strPIname;
...
CString out1 = strPIname; // no strcpy; safe; Unicode-ready
HTH,
Giovanni