Ana*_*and -4 c++ void-pointers
什么错误的代码.应该是什么.因为它抛出一个错误.运算符'delete',应用于void*参数.
int i;
void *ptr = &i;
delete ptr;
Run Code Online (Sandbox Code Playgroud)
什么错误的代码.
除了之外的一切 int i;
第二行尝试将整数转换为指针.在特殊情况下,你可以强制通过编译器reinterpret_cast; 但是如果整数以某种方式包含有效的指针值,程序将只能正常运行.(更新:现在已经编辑了问题以取代地址i;所以这一行不再错误).
第三行尝试使用无效指针类型删除无效内存.
应该是什么.
还有别的.不知道你想做什么,这是不可能的.也许你想要:
int i;
void * ptr = &i; // Points to `i`, losing type information.
Run Code Online (Sandbox Code Playgroud)
运算符
delete,适用于void*参数.
这总是错的.您必须只有delete您之前分配的对象new; 并且指针必须是正确的类型.
(或者基类,如果它是具有虚拟析构函数的类类型)
所以以下是正确的; 但除非你有充分的理由进行动态分配,否则毫无意义:
int * ptr = new int;
delete ptr;
Run Code Online (Sandbox Code Playgroud)
当然,如果您编写的代码应该能够抵御内存泄漏和运行时错误,那么您应该使用RAII类型(如容器和智能指针)来管理所有动态内存.所以,如果你需要一个动态对象,你应该这样做:
std::unique_ptr<int> ptr(new int);
Run Code Online (Sandbox Code Playgroud)
如果你想在当前范围的末尾删除它或将其移动到另一个范围; 要么
auto ptr = std::make_shared<int>();
Run Code Online (Sandbox Code Playgroud)
如果您想在多个范围之间共享所有权.在任何一种情况下,指针都会在完成后自动删除对象.