【发布时间】:2015-11-27 05:51:07
【问题描述】:
我正在一个函数中创建一个新的struct SThreadInfo:
struct SThreadInfo {
int function;
Exchange* pThis;
};
struct SThreadInfo *threadInfo = new (struct SThreadInfo);
threadInfo->function = 0;
threadInfo->pThis = this;
然后,在同一个函数中,我创建一个新线程并将结构作为 void-pointer 传递:
pthread_t ret;
pthread_create(&ret, NULL, Exchange::staticThreadHelper, (void*)threadInfo);
在新线程中,我从 void-pointer 重建结构:
void* Exchange::staticThreadHelper(void* t)
{
struct SThreadInfo* threadInfo = (struct SThreadInfo*)t;
//....
//....
}
在这个函数的最后我想删除t和threadInfo分配的内存。到目前为止,它适用于threadInfo,但不适用于t
delete threadInfo;
delete static_cast<struct SThreadInfo*>(t);
当我尝试将 void 指针转换回 SThreadInfo 时,会引发 SIGABRT。 有人能告诉我如何正确地从 void-pointer 中删除内存吗?
【问题讨论】:
-
@CaptainObvlious:真的吗?在这种情况下,编译器当然应该在编译时抱怨。问题不是“双重删除”的问题,换句话说,OP 试图两次删除同一个对象吗?
-
看看最后一段代码 - 我正在尝试使用 static_cast
-
看起来你正在删除内存两次:一次通过 t,一次通过 threadInfo。由于 threadInfo 只是 t 的转换,因此两者都指向同一个对象,只能删除一次。
标签: c++ pointers struct delete-operator void-pointers