空指针和对象删除
在 C 中,空指针可用于存储任何类型的对象的地址。出现一个常见问题:我们可以通过 void 指针安全地删除对象吗?
问题:
考虑以下代码:
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete [] ptr; }
这里,my_alloc分配一个char数组并返回一个void指针。 my_free 尝试删除 void 指针指向的对象。
答案:
根据 C 语言,通过 void 指针而不进行强制转换来删除对象是未定义行为标准 (5.3.5/3)。这意味着该行为可能因编译器和平台而异。
这种未定义行为的原因是编译器无法确定要删除的对象的实际类型。因此,无法保证调用正确的析构函数,可能会导致内存损坏或其他意外行为。
安全方法:
安全删除通过 void 指针创建对象时,必须将其强制转换为分配该对象的原始指针类型。这可确保调用正确的析构函数,并正确清理与该对象关联的任何资源。
例如,在上面的代码中,应按如下方式进行删除:
char* ptr = (char*)my_alloc(size); delete [] ptr;
以上是我可以通过 C 中的空指针安全地删除对象吗?的详细内容。更多信息请关注PHP中文网其他相关文章!