C++ 删除空指针指向的内存

C++ 删除空指针指向的内存,c++,pointers,struct,delete-operator,void-pointers,C++,Pointers,Struct,Delete Operator,Void Pointers,我正在函数中创建一个新的struct SThreadInfo: struct SThreadInfo { int function; Exchange* pThis; }; struct SThreadInfo *threadInfo = new (struct SThreadInfo); threadInfo->function = 0; threadInfo->pThis = this; 然

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

struct SThreadInfo {
    int             function;
    Exchange*       pThis;
};

struct SThreadInfo *threadInfo = new (struct SThreadInfo);
    threadInfo->function    = 0;
    threadInfo->pThis       = this;
然后,在同一个函数中,我创建了一个新线程,并将结构作为void指针传递:

pthread_t ret;
pthread_create(&ret, NULL, Exchange::staticThreadHelper, (void*)threadInfo);
void* Exchange::staticThreadHelper(void* t)
{
    struct SThreadInfo* threadInfo = (struct SThreadInfo*)t;
    //....
    //....
}
在新线程中,我从void指针重建结构:

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);
删除threadInfo;
删除静态_cast(t);
当我试图将void指针转换回SThreadInfo时,会引发一个SIGABRT。 有人能告诉我如何正确地从空指针中删除内存吗?

行:

struct SThreadInfo* threadInfo = (struct SThreadInfo*)t;
不“重建”“任何内容,它只为声明的变量分配类型转换值。是同一个指针

在函数末尾,您似乎要删除(释放)同一地址两次,这就是为什么会出现异常情况。

行:

struct SThreadInfo* threadInfo = (struct SThreadInfo*)t;
不“重建”“任何内容,它只为声明的变量分配类型转换值。是同一个指针


在函数的末尾,似乎要删除(释放)同一地址两次,这就是为什么会出现异常。

因此,这里的问题是,您有一块内存,有两个不同的指针指向

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


因此,在这种情况下,
delete static_cast(t)
删除线程信息应该可以做到这一点。多次尝试删除相同的内存将导致未定义的行为[显然,运行库检测到这一点并中止执行]。

因此,这里的问题是,您有一块内存,有两个不同的指针指向它

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


因此,在这种情况下,
delete static_cast(t)
删除线程信息应该可以做到这一点。多次尝试删除同一内存将导致未定义的行为[显然,您的运行库检测到这一点并中止执行]。

@CaptainObvlious:真的吗?当然,在这种情况下,编译器应该在编译时抱怨。问题不是“双重删除”的问题,换句话说,OP尝试两次删除同一个对象吗?请看最后一段代码-我尝试使用static_cast。看起来您正在两次删除内存:一次通过t,一次通过threadInfo。因为threadInfo只是t的一个类型转换,所以两者都指向同一个对象,只能删除一次。@CaptainObvlious:真的吗?当然,在这种情况下,编译器应该在编译时抱怨。问题不是“双重删除”的问题,换句话说,OP尝试两次删除同一个对象吗?请看最后一段代码-我尝试使用static_cast。看起来您正在两次删除内存:一次通过t,一次通过threadInfo。由于threadInfo只是t的一个类型转换,所以两者都指向同一个对象,该对象只能删除一次。
delete threadInfo也可以工作,因为
threadInfo
被键入为
struct SThreadInfo*
,因此将调用与
delete static_cast(t)相同的析构函数。不要同时调用
delete
语句,因为它们是指向同一内存块的两个指针,应该只释放一次也可以工作,因为
threadInfo
被键入为
struct SThreadInfo*
,因此将调用与
delete static_cast(t)相同的析构函数。不要同时调用
delete
语句,因为它们是指向同一内存块的两个指针,应该只释放一次。谢谢!其实很明显:谢谢你!其实很明显:D