首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >删除空指针安全吗?

删除空指针安全吗?
EN

Stack Overflow用户
提问于 2009-06-02 20:47:47
回答 9查看 66.6K关注 0票数 98

假设我有以下代码:

代码语言:javascript
复制
void* my_alloc (size_t size)
{
   return new char [size];
}

void my_free (void* ptr)
{
   delete [] ptr;
}

这个安全吗?还是必须在删除前将ptr转换为char*

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-06-02 21:14:18

这取决于“安全”。它通常会工作,因为关于分配本身的信息与指针一起存储,因此释放分配器可以将其返回到正确的位置。从这个意义上说,只要你的分配器使用内部边界标记,它就是“安全的”。(许多人都这样做。)

然而,正如在其他答案中提到的,删除空指针将不会调用析构函数,这可能是一个问题。从这个意义上说,它不是“安全的”。

没有很好的理由去做你正在做的事情。如果您想编写自己的释放函数,可以使用函数模板来生成具有正确类型的函数。这样做的一个很好的理由是生成池分配器,这对于特定类型非常有效。

正如在其他答案中提到的,这是C++中的undefined behavior。一般来说,避免未定义的行为是很好的,尽管主题本身很复杂,充满了相互矛盾的观点。

票数 25
EN

Stack Overflow用户

发布于 2009-06-02 21:05:15

删除空指针是危险的,因为析构函数不会在它实际指向的值上被调用。这可能会导致应用程序中的内存/资源泄漏。

票数 13
EN

Stack Overflow用户

发布于 2009-06-04 07:34:11

如果您真的必须这样做,为什么不跳过中间人( newdelete操作符),直接调用全局operator newoperator delete呢?(当然,如果您试图检测newdelete运算符,则实际上应该重新实现operator newoperator delete。)

代码语言:javascript
复制
void* my_alloc (size_t size)
{
   return ::operator new(size);
}

void my_free (void* ptr)
{
   ::operator delete(ptr);
}

请注意,与malloc()不同的是,operator new会在失败时抛出std::bad_alloc (如果注册了new_handler,则会调用它)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/941832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档