C++ delete[] void* curiosity
C++ delete[] void* curiosity
我已经有了一个相当简单但很大的系统设置。它将数据存储在void*
数组中,因为它存储的数据可能在float
或double
之间变化,这取决于所需的精度。
只是执行delete [] data
,使用MinGW引发warning: deleting 'void*' is undefined [enabled by default]
。我有另一个变量告诉我data
是float*
还是double*
,但我用哪个重要吗?
换句话说,我可以使用下面的代码而不用担心内存泄漏,或其他错误/损坏未被编译器捕获?
double* d_data = new double[length];
data = (void*)d_data;
delete [] (float*)data;
这当然很重要;用于delete[]
的指针必须与分配的指针具有相同的类型。所以转换为double*
是有效的(但容易出错);强制转换为float*
会产生未定义的行为。
double
,或数组。]
对于内存泄漏:手动内存管理总是有内存泄漏的危险,除非您非常小心,永远不要做任何可能抛出异常的事情。我强烈建议使用RAII来管理所有的动态资源。
看起来您可能需要使用一个联合。
是的,这很重要(并且转换到其他数据类型本质上与离开void*
一样糟糕),因为您实际上丢失/搞砸了额外的元数据(如实际长度)。它可能不一定会崩溃(例如,你可以使用delete data;
而不是delete [] data;
,除非编译器注意到错误,否则会泄漏),因为它本质上是未定义的行为(不同的编译器或版本可能会产生不同的结果)。
正如Jorge建议的那样,您可能只想为此使用联合,以便两种数据类型可以共享相同的内存:
union my_union {
double d_double;
float d_float;
};
根据编译器的不同,该结构体通常与内部最大的数据类型相同(在这种情况下(在32位机器上),双精度类型可能为8字节,浮点类型为4字节;所以总大小是8字节,因为这些变量本质上是重叠的)。请记住,您不能将此用于某种自动转换。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- C++ delete[] void* curiosity