gpt4 book ai didi

c++ - 在 C++ 中删除 void 指针

转载 作者:行者123 更新时间:2023-11-30 05:14:33 24 4
gpt4 key购买 nike

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

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

并有稍微安全的行为。

关于c++ - 在 C++ 中删除 void 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43403957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com