在 C++ 中删除 void 指针

Deleting a void pointer in C++

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

我知道您不应该删除 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]);

并有稍微安全的行为。

删除空指针的问题是没有调用析构函数。所以如果你有一个 returns 拥有指针的函数,你也应该有一个销毁它的函数。