我的任务是修复项目中的一些可能的错误,发现其中一个函数正在删除一个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()
的内容?
答案 0 :(得分:1)
如果可能,请更改此代码以使用包含所有必需子对象的struct
。
如果我们继续检查所有使用的类型是POD并且盲目地假设没有对齐问题并且编译器没有陷入任何严格的别名陷阱,那么是的,你可以将删除更改为
delete[] static_cast<unsigned char*>(a[0]);
delete[] static_cast<unsigned char*>(a[1]);
并且行为稍微安全。
答案 1 :(得分:0)
删除void指针的问题是不会调用destuctors。因此,如果你有一个返回拥有指针的函数,你应该有一个破坏它的函数。