关于c ++:删除void指针指向的内存

Deleting memory pointed to by a void pointer

我正在一个函数中创建一个新的struct SThreadInfo

1
2
3
4
5
6
7
8
struct SThreadInfo {
    int             function;
    Exchange*       pThis;
};

struct SThreadInfo *threadInfo = new (struct SThreadInfo);
    threadInfo->function    = 0;
    threadInfo->pThis       = this;

然后,在同一个函数中,我创建一个新线程,并将结构作为空指针传递:

1
2
pthread_t ret;
pthread_create(&ret, NULL, Exchange::staticThreadHelper, (void*)threadInfo);

在新线程中,我从空指针重新生成结构:

1
2
3
4
5
6
void* Exchange::staticThreadHelper(void* t)
{
    struct SThreadInfo* threadInfo = (struct SThreadInfo*)t;
    //....
    //....
}

在这个函数的末尾,我想删除tthreadInfo分配的内存。到目前为止,它只适用于threadInfo,而不适用于t

1
2
delete threadInfo;
delete static_cast<struct SThreadInfo*>(t);

当我试图将空指针强制转换回sthreadinfo时,会引发sigabrt。有人能告诉我如何正确地从空指针中删除内存吗?


线:

1
struct SThreadInfo* threadInfo = (struct SThreadInfo*)t;

不"重建"任何东西,它只为声明的变量分配类型转换值。它是同一个指针。

在函数的最后,您似乎要删除(释放)同一个地址两次,这就是您得到异常的原因。


所以,这里的问题是你有一个内存块,你有两个不同的指针。

您应该只释放一次分配的内存。如果您有一个带有析构函数的对象[包括具有隐含的析构函数的对象,例如包含另一个带有析构函数的对象的对象,如std::stringstd::vector,则应确保delete调用的类型正确。

因此,在这种情况下,要么是delete static_cast(t);要么是delete threadinfo;应该会起作用。多次尝试使用同一内存会导致未定义的行为[显然,运行库检测到这一点并中止执行]。