删除C++中的空指针
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]);
并且行为稍微安全一些。
删除 void 指针的问题在于不调用 destuctors。因此,如果你有一个返回拥有的指针的函数,你也应该有一个破坏它的函数。
相关文章:
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- cppcheck取消引用空指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 递增空指针无法正确设置值
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- 将多映射转换为空指针,然后转换回多映射