Try just using a placement new. pData = new ((TransformationData *) TSmalloc(sizeof(TransformationData))) TransformationData();
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; > > } > > > > >
