By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,152 Members | 2,193 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,152 IT Pros & Developers. It's quick & easy.

What instead of new/delete?

P: n/a
Can I use any method to allocate /deallocate memory other than new/
delete operators? Actually the problem is while using delete operator
in my ".sqc" files the application crashes. It seems the memory
location is locked by DB and so it throws an 'unhandled exception'.
Following is the code snippet from my application and now i dont wanna
touch the basic design.

Regards,
UvT

Code Snippet:
//----------------------------------------------------------------------------
// SQLFetchfun() - Fetch the next record pointing by the cursor.
//-----------------------------------------------------------------------------

long SQLfunFetch(fun *afun)
{
#if 0
EXEC SQL BEGIN DECLARE SECTION;
char hv_fnName[31];
char hv_fnID[16];
char hv_area[11];
short *hv_fnCrType;
char hv_creatorName[21];
char hv_creatorID[11];
EXEC SQL END DECLARE SECTION;
#else
/* char *hv_fnName; //Comments : Here comment the
earlier code & intialize all the
char *hv_fnID; // pointer variables with "new"
declaration.
char *hv_area;
short *hv_fnCrType;
char *hv_creatorName;
char *hv_creatorID;*/

char *hv_fnName = new char[sizeof(afun-
>fnName)*sizeof(TCHAR)]; //Comments : use sizeof var name * sizeof
TCHAR
char *hv_fnID = new char[sizeof(afun->fnID)*sizeof(TCHAR)];
char *hv_area = new char[sizeof(afun->area)*sizeof(TCHAR)];
short *hv_fnCrType;
char *hv_creatorName = new char[sizeof(afun-
>creatorName)*sizeof(TCHAR)];
char *hv_creatorID = new char[sizeof(afun-
>creatorID)*sizeof(TCHAR)];
#endif

EXEC SQL SET SQLCA "gpSqlca";

/* hv_fnName = cfun->fnName; //Comments : Here comment the
earlier code of intialization & use Convertto_mbcs
hv_fnID = cfun->fnID; //
hv_area = cfun->area;
hv_fnCrType = &cfun->fnCrType;
hv_creatorName = cfun->creatorName;
hv_creatorID = cfun->creatorID;*/

Convertto_mbcs(afun->fnName,hv_fnName);
Convertto_mbcs(afun->fnID,hv_fnID);
Convertto_mbcs(afun->area,hv_area);
Convertto_mbcs(afun->creatorName,hv_creatorName);
Convertto_mbcs(afun->creatorID,hv_creatorID);
hv_fnCrType = &afun->fnCrType;
EXEC SQL FETCH RELATIVE 1 funCursor
INTO :hv_fnName,
:hv_fnID,
:hv_area,
:hv_fnCrType,
:hv_creatorName,
:hv_creatorID; //Comments : After the SQL statement is
finished convert the vaules from
// host variable to widechar & fill the unicode
structure
Convertto_widechar(afun->fnName,hv_fnName);
Convertto_widechar(afun->fnID,hv_fnID);
Convertto_widechar(afun->area,hv_area);
Convertto_widechar(afun->creatorName,hv_creatorName);
Convertto_widechar(afun->creatorID,hv_creatorID);

delete hv_fnName; //Comments : Delete the
variables earlier assigned with "new"
delete hv_fnID;
delete hv_area;
delete hv_creatorID;
delete hv_creatorName;

return ( gpSqlca->sqlcode );

}

Mar 12 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
uj***********@gmail.com wrote:
Can I use any method to allocate /deallocate memory other than new/
delete operators?
You don't need to. You're using 'delete' to free memory allocated
by 'new[]'. Use

delete[] blah;

instead. And read up on the differences.
Actually the problem is while using delete operator
in my ".sqc" files the application crashes. It seems the memory
location is locked by DB and so it throws an 'unhandled exception'.
Following is the code snippet from my application and now i dont wanna
touch the basic design.
[..]
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Mar 12 '07 #2

P: n/a
uj***********@gmail.com wrote:
Can I use any method to allocate /deallocate memory other than new/
delete operators? Actually the problem is while using delete operator
in my ".sqc" files the application crashes.
Not using delete will not make your program run correctly, I'd say you
messed up in some other place, only that it remains invisible until you
try to invoke delete.
It seems the memory location is locked by DB and so it throws
an 'unhandled exception'.
It throws a C++ exception? That would mean that you make some logic error
and the allocation method is not the problem. However, throwing from a
destructor is a bad idea, so there might be other things wrong, too.

Please clean up your code before posting. In particular remove unused parts
and make sure the code can be compiled.
char *hv_fnName = new char[sizeof(afun->fnName)*sizeof(TCHAR)];
What is this supposed to do? Are you using the chars as raw storage or as a
distinct number of chars? In the former case, computing the number of
required chars is correct, in the latter it should only contain the number
of chars you want. Also pay attention that TCHAR is not a standard type
and that its size and underlying type depend on the context. Ask in a
win32-related group about that.
//Comments : use sizeof var name * sizeof TCHAR
What is this comment telling you? Also, if 'afun->fnName' is a pointer, you
will get the size of a pointer and not the size required for the string.
BTW, when sizeof is applied to an object, you don't have to use brackets.

My suggestion:
1. If you are using strings (i.e. text) use std::string, std::wstring or if
you really are working TCHAR-based std::basic_string<TCHAR>. Forget about
new/delete for managing strings.
2. If you need a temporary buffer, use std::vector<>.

EXEC SQL SET SQLCA "gpSqlca";
Nobody without background can interpret this. It is not part of standard
C++. If this is not the problem, you should have removed it during the
cleanup before posting.
Convertto_mbcs(afun->fnName,hv_fnName);
I strongly guess that you messed up between pointer sizes and array sizes.
Use strings, not raw arrays or new/delete.
delete hv_fnName;
If you use the array form of new, you also have to use the array form of
delete. See the C++ FAQ at parashift's.
return ( gpSqlca->sqlcode );
'return' is not a function, no need for brackets.

Uli

--
FAQ: http://ma.rtij.nl/acllc-c++.FAQ.html
Asking smart questions: http://www.catb.org/~esr/faqs/smart-questions.html
Mar 12 '07 #3

P: n/a
In article <et**********@news.datemas.de>, Victor Bazarov
<v.********@comAcast.netwrites
>uj***********@gmail.com wrote:
>Can I use any method to allocate /deallocate memory other than new/
delete operators?

You don't need to. You're using 'delete' to free memory allocated
by 'new[]'. Use

delete[] blah;

instead. And read up on the differences.

And better still use some suitable library type instead of doing manual
allocation/deallocation of dynamic memory. Either std::vector<or
std::string.
--
Francis Glassborow ACCU
Author of 'You Can Do It!' and "You Can Program in C++"
see http://www.spellen.org/youcandoit
For project ideas and contributions: http://www.spellen.org/youcandoit/projects
Mar 12 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.