C++中void * arg 指向了一块new的堆空间,我该怎么delete
时间: 2024-11-03 15:14:41 浏览: 8
在C++中,如果你不确定`void*`指针指向的具体类型,不能直接调用`delete`来释放内存,因为`delete`操作通常与特定类型的动态分配相关联。当你从函数返回一个`void*`类型的指针,且该指针是由`new`动态分配的,你应该使用`delete_cast<T*>(arg)`来确保正确的析构并释放内存,其中`T`是实际的存储类型。这里有一个示例:
```cpp
#include <iostream>
using namespace std;
// 假设我们有一个具体的类型T
class MyClass {
public:
MyClass(int x) : data(x) {}
~MyClass() { cout << "MyClass destructor called.\n"; }
private:
int data;
};
// 函数A返回void*指针
void* A() {
MyClass* obj = new MyClass(42); // 动态分配MyClass实例
return obj; // 返回指向的对象地址
}
int main() {
void* ptr = A();
if (ptr != nullptr) { // 检查指针是否为空
delete_cast<MyClass*>(ptr); // 正确地删除MyClass实例
}
return 0;
}
```
在这个例子中,`delete_cast`确保了正确的析构(`~MyClass()`)被执行,即使`ptr`实际上是指向`MyClass`的。
阅读全文