删除C++中的空指针

Deleting a void pointer in C++

本文关键字:空指针 C++ 删除      更新时间:2023-10-16

我的任务是修复我们项目中一些可能的错误,发现其中一个函数中的空指针被删除。

我知道您不应该删除 void 指针,并且在删除它之前必须将其转换回其原始类型,以便正确销毁它。但是,代码如下所示:

void someFunction () {
    void *a[2] = {NULL, NULL};
    initializeFunction(a+0);
    initializeFunction(a+1);
    ...
    //do something
    ...
    delete a[0];
    delete a[1];
}
initializeFunction(void** b) {
    *b = new unsigned char [size]; //size is calculated based on all the types and how many of each are used in innerFunction()
    innerFunction((char *)*b);
}
innerFunction(char * x) {
    *((int *)x) = intValue;
    *((double *)(x += sizeof(int))) = doubleValue;
    *((SomeClass *)(x += sizeof(doubleValue))) = aSomeClassObject;
    *((AnotherClass *)(x += sizeof(aSomeClassObject))) = anAnotherClassObject;
}

我不确定如何处理这个问题,因为我从未遇到过这样的用法。我对保存的所有演员和各种类型感到困惑。该innerFunction在实际代码中具有更多类型。(尽管可能值得注意的是,除了原始数据类型之外,使用的所有用户定义类都只有数组成员变量。

为了删除a,是不是像投射到(unsigned char*)那么简单?还是这不起作用,因为从技术上讲,内存中有不同的类型由a指向?我是否必须执行等效于innerFunction()的删除?

如果

可能,请将此代码更改为使用包含所有必要子对象的struct

如果我们只是继续检查使用的所有类型都是 POD,并盲目地假设没有对齐问题并且编译器没有陷入任何严格的别名陷阱,那么是的,您可以将删除更改为

delete[] static_cast<unsigned char*>(a[0]);
delete[] static_cast<unsigned char*>(a[1]);

并且行为稍微安全一些。

删除 void 指针的问题在于不调用 destuctors。因此,如果你有一个返回拥有的指针的函数,你也应该有一个破坏它的函数。