【问题标题】:Deleting memory pointed to by a void pointer删除 void 指针指向的内存
【发布时间】: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;
    //....
    //....
}

在这个函数的最后我想删除tthreadInfo分配的内存。到目前为止,它适用于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


【解决方案1】:

行:

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

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

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

【讨论】:

  • 谢谢!实际上很明显:D
【解决方案2】:

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

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

所以在这种情况下,delete static_cast&lt;SthreadInfo*&gt;(t);delete threadinfo; 应该可以解决问题。多次尝试delete 相同的内存将导致未定义的行为[显然您的运行时库检测到这一点并中止执行]。

【讨论】:

  • delete threadInfo; 也可以工作,因为threadInfo 的类型为struct SThreadInfo*,因此将调用与delete static_cast&lt;SthreadInfo*&gt;(t); 相同的析构函数。只是不要同时调用delete 语句,因为它们是指向同一个内存块的两个指针,应该只释放一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 2012-08-05
  • 2010-09-08
  • 1970-01-01
  • 2016-03-21
  • 2018-03-03
相关资源
最近更新 更多