在C++中,如果要删除一个指针,确保这个指针是通过new关键字分配的内存,并且没有被转移到其他对象。如果指针是通过new关键字创建的,并且没有被转移到其他对象,那么它是一个原始指针。
下面是一个示例代码,展示了如何确保只删除原始指针而不是owner
#include
template
class owner {
public:
owner(T* p) : ptr(p) {}
~owner() { delete ptr; }
private:
T* ptr;
};
template
void deleteRawPointer(T* ptr) {
if (dynamic_cast*>(ptr) == nullptr) {
delete ptr;
}
}
int main() {
int* rawPtr = new int(10);
owner* ptr = new owner(rawPtr);
deleteRawPointer(ptr); // 不会删除原始指针
deleteRawPointer(rawPtr); // 删除原始指针
return 0;
}
在上面的示例中,我们定义了一个deleteRawPointer
函数,它接受一个指针作为参数。函数内部使用dynamic_cast
来检查指针是否是owner
类型的指针。如果不是,则说明它是一个原始指针,可以直接用delete
进行删除。
请注意,在使用dynamic_cast
时,必须确保owner
类定义了至少一个虚函数,以使其成为多态类型。否则,dynamic_cast
将无法正常工作。
此解决方案可以确保只删除原始指针,而不删除owner
类型的指针。
上一篇:不要删除Firebase云函数
下一篇:不要上传多个文件