删除 void 指针指向的内存

Deleting memory pointed to by a void pointer

我正在函数中创建一个新的 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* Exchange::staticThreadHelper(void* t)
{
    struct SThreadInfo* threadInfo = (struct SThreadInfo*)t;
    //....
    //....
}

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

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

当我尝试将空指针转换回 SThreadInfo 时,引发了 SIGABRT。 谁能告诉我如何正确地从 void-pointer 中删除内存?

行:

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

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

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

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

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

所以在这种情况下,delete static_cast<SthreadInfo*>(t);delete threadinfo; 都可以。多次尝试 delete 同一内存将导致未定义的行为 [显然您的运行时库会检测到这一点并中止执行]。