删除 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;
//....
//....
}
在这个函数的最后我想删除t
和threadInfo
分配的内存。到目前为止,它适用于 threadInfo
但不适用于 t
delete threadInfo;
delete static_cast<struct SThreadInfo*>(t);
当我尝试将空指针转换回 SThreadInfo 时,引发了 SIGABRT。
谁能告诉我如何正确地从 void-pointer 中删除内存?
行:
struct SThreadInfo* threadInfo = (struct SThreadInfo*)t;
不“重建”任何东西,它只是将类型转换值分配给声明的变量。是同一个指针。
在函数的最后,您似乎两次删除(释放)同一个地址,这就是您得到异常的原因。
所以,这里的问题是你有一个内存块,你有两个不同的指针。
您应该只释放一次分配的内存。如果您有一个带有析构函数的对象[包括具有隐式破坏的对象,例如包含另一个带有析构函数的对象的东西,例如 std::string
或 std::vector
],您应该确保使用正确的类型进行 delete
调用。
所以在这种情况下,delete static_cast<SthreadInfo*>(t);
或 delete threadinfo;
都可以。多次尝试 delete
同一内存将导致未定义的行为 [显然您的运行时库会检测到这一点并中止执行]。
我正在函数中创建一个新的 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;
//....
//....
}
在这个函数的最后我想删除t
和threadInfo
分配的内存。到目前为止,它适用于 threadInfo
但不适用于 t
delete threadInfo;
delete static_cast<struct SThreadInfo*>(t);
当我尝试将空指针转换回 SThreadInfo 时,引发了 SIGABRT。 谁能告诉我如何正确地从 void-pointer 中删除内存?
行:
struct SThreadInfo* threadInfo = (struct SThreadInfo*)t;
不“重建”任何东西,它只是将类型转换值分配给声明的变量。是同一个指针。
在函数的最后,您似乎两次删除(释放)同一个地址,这就是您得到异常的原因。
所以,这里的问题是你有一个内存块,你有两个不同的指针。
您应该只释放一次分配的内存。如果您有一个带有析构函数的对象[包括具有隐式破坏的对象,例如包含另一个带有析构函数的对象的东西,例如 std::string
或 std::vector
],您应该确保使用正确的类型进行 delete
调用。
所以在这种情况下,delete static_cast<SthreadInfo*>(t);
或 delete threadinfo;
都可以。多次尝试 delete
同一内存将导致未定义的行为 [显然您的运行时库会检测到这一点并中止执行]。