On 24/01/2013, at 3:14 PM, Brian Geffon <[email protected]> wrote:

> Try just using a placement new.
> 
> pData = new ((TransformationData *) TSmalloc(sizeof(TransformationData))) 
> TransformationData();

and don't forget to call the destructor before calling TSfree:
        pData->~TransformationData();
        TSfree(pData);

> 
> Brian
> 
> On Thu, Jan 24, 2013 at 2:32 PM, Owens, Steve <[email protected]> wrote:
> 
> I ran into a bit of an issue today related to TSMalloc
> 
> Suppose I have a plugin which defines a plugin data structure such as:
> 
> typedef struct {
>         int state;
>         TSVIO output_vio;
>         TSIOBuffer output_buffer;
>         TSIOBufferReader output_reader;
>         std::string foo;
>     } TransformationData;
> 
> 
> And I have some plugin code which does this:
> 
> void allocTransformationData(){
>       TransformationData *pData;
> 
>       pData = (TransformationData *) TSmalloc(sizeof(TransformationData));
>       pData->state = STATE_START;
>       pData->output_buffer = NULL;
>       pData->output_vio = NULL;
>       pData->output_reader = NULL;
>       
>       pData->foo.assign("bar");
> 
>       return pData;
> }
> 
> The line  pData->foo.assign("bar");
> 
> 
> Will result in a segmentation fault.
> 
> Is there a best practice idiom for using std::string items in custom 
> continuation data?  For example should I be using
> 
> typedef struct {
>         int state;
>         TSVIO output_vio;
>         TSIOBuffer output_buffer;
>         TSIOBufferReader output_reader;
>         std::string *foo;
>     } TransformationData;
> 
> And 
> 
> 
> Void allocTransformationData(){
>       TransformationData *pData;
> 
>       pData = (TransformationData *) TSmalloc(sizeof(TransformationData));
>       pData->state = STATE_START;
>       pData->output_buffer = NULL;
>       pData->output_vio = NULL;
>       pData->output_reader = NULL;
>       
>  
>       pData->foo = new std::string;
>         pData->foo.assign("bar");
> 
>       return pData;
> }
> 
> Or should I use:
> 
> Void allocTransformationData(){
>       TransformationData *pData;
> 
>       pData = (TransformationData *) TSmalloc(sizeof(TransformationData));
>       pData->state = STATE_START;
>       pData->output_buffer = NULL;
>       pData->output_vio = NULL;
>       pData->output_reader = NULL;
>       
>  
>       pData->foo = (std::string*) Tsmalloc(sizeof(std::string));
>         pData->foo.assign("bar");
> 
>       return pData;
> }
> 
> 
> 
> 
> 
> 

Reply via email to