On May 25, 3:59 pm, jean.daniel.mich...@gmail.com wrote:
> Hi,
>
> > Dear Friends
>
> > I have the follwoing function "tss_fe_get_own_info" which has the
> > arguments as shows below
> > tss_fe_get_own_info(char *user_id, tss_user_profile_t
> > **p_buf_UserSecInfo, error_status_t *retStatus)
>
> > // Structure tss_user_profile_t from the function
>
> > tss_user_profile_t **p_buf_UserSecInfo;
> > *p_buf_UserSecInfo = new tss_user_profile_t;
> > memset((void*) *p_buf_UserSecInfo, '\0',
>
> Here you got a pointer to a pointer. If the first thing you do after
> declaration is dereferencing the pointer like this:
> *p_buf_UserSecInfo, I think you are running into trouble, because
> p_buf_UserSecInfo is not initialized and is pointing nowhere (or
> anywhere) in memory. Dereferencing it like you do has no sense... Who
> says pointer says array. If you got a pointer of pointer like this
> it's because you want a array of pointers. You'd better do something
> like:
>
> tss_user_profile_t **p_buf_UserSecInfo;
> p_buf_UserSecInfo = new *tss_user_profile_t[SOME_INTERGER_VALUE]; //
> With SOME_INTERGER_VALUE possibly equal to 1
> for (unsigned int i = 0; i < SOME_INTERGER_VALUE; ++i)
> {
> p_buf_UserSecInfo[i] = new tss_user_profile_t;
> memset((void*) p_buf_UserSecInfo[i], 0, sizeof(tss_user_profile_t));
>
> }
>
> > unsigned32 len1 = 0;
> > char *attr1 = NULL;
>
> > odss_attribute_value_list_t *tmp1 = (*p_buf_UserSecInfo)->ProcAttr;
>
> Again, I don't get what you do. (*p_buf_UserSecInfo)->ProcAttr is NULL
> here (remember the memset), so tmp1 is NULL too.
>
>
>
> > ProcAttr = new odss_attribute_value_list_t;
>
> ProcAttr is not declared anywhere, so it should not compile.
>
> > ProcAttr->attribute_value = new odss_attribute_value_t;
> > ProcAttr->attribute_value->length = len1;
> > ProcAttr->attribute_value->attribute = attr1;
>
> attr1 is NULL anyway so you'better write
> ProcAttr->attribute_value->attribute = NULL;
>
> > ProcAttr->next = tmp1;
>
> Here too:
> ProcAttr->next = NULL;
>
> I guess, what do you want to do is:
>
> (*p_buf_UserSecInfo)->ProcAttr = new odss_attribute_value_list_t;
> (*p_buf_UserSecInfo)->ProcAttr->attribute_value = new
> odss_attribute_value_t;
> (*p_buf_UserSecInfo)->ProcAttr->attribute_value->length = 0;
> (*p_buf_UserSecInfo)->ProcAttr->attribute_value->attribute = NULL;
> (*p_buf_UserSecInfo)->ProcAttr->next = NULL;
>
>
>
> > Please let me know if this is the correct way to allocate the memory
>
> Or maybe I just didn't understand your post at all 
>
> JD
Hi JD thanks for your comments.
here is the background of what Im doiong This is SOAP Interface that
Im writing and method tss_fe_get_own_info calls to DCE ( Distributed
Computing Environment ) and DCE internally calls Oracle DB using
pro*c. Now in the function
char *user_id = IN parameter which is passed to SOAP from Front End
( J2EE)
and tss_user_profile_t **p_buf_UserSecInfo , error_status_t
*retStatus are OUT parameters sent from DCE to Frront End via SOAP.
I have to stored the return object from DCE to the structure
tss_user_profile_t
Since its a linked list type , I have to allocate memory to
tss_user_profile_t structure dynamically using new operator so that I
can store the return object. Structure tss_user_profile_t has nested
structures with pointers , things got complicated.
This is what I have now and its compiling
tss_user_profile_t **p_buf_UserSecInfo;
*p_buf_UserSecInfo = new tss_user_profile_t[1];
for (unsigned int i = 0; i < 1; ++i)
{
p_buf_UserSecInfo[i] = new tss_user_profile_t;
memset((void*)p_buf_UserSecInfo[i],0,
sizeof(tss_user_profile_t));
}
(*p_buf_UserSecInfo)->ProcAttr = new odss_attribute_value_list_t;
(*p_buf_UserSecInfo)->ProcAttr->attribute_value = new
odss_attribute_value_t;
(*p_buf_UserSecInfo)->ProcAttr->attribute_value->length = 0;
(*p_buf_UserSecInfo)->ProcAttr->attribute_value->attribute = NULL;
(*p_buf_UserSecInfo)->ProcAttr->next = NULL;
Now If I want to free the allocated memory then do I need to write
delete for all allocated structures ?
How it could be done
Please let me know
Thanks for your comments
Amit