gpt4 book ai didi

c++在请求特定字节的新之后删除

转载 作者:行者123 更新时间:2023-11-27 23:36:58 29 4
gpt4 key购买 nike

这段代码内存韭菜有空吗?

char *buffer = (char *) (::operator new(n));
delete buffer;

它与“传统括号形式”选项有什么不同(当我们谈论原始类型时):

char *buffer = new char[n];
delete[] buffer;

我猜,有 3 个选项:

a) 将仅释放 1 个字节(n - 1 泄漏)

b) 将释放整个分配的 block (n 字节)

c) 未定义的行为(取决于实现)

我的想法:对于原始类型 char 只有 free 被触发(不调用析构函数)并且 free 知道应该释放多少字节(存储在分配器中元信息)。所以,这段代码应该是正确的。

添加:

混合使用 operator new/deleteexpression new/delete 将导致未定义的行为。所以这是一个糟糕的代码。

根据 http://eel.is/c++draft/expr.delete#2,使用 operator delete 的选项也是错误的:

char *buffer = (char *) (::operator new(n));
::operator delete(buffer);

所以唯一的变体:

char *buffer = new char[n];
delete[] buffer;

最佳答案

根据 http://eel.is/c++draft/expr.delete#2

In a single-object delete expression, the value of the operand of delete may be

  • a null pointer value
  • a pointer to a non-array object created by a previous new-expression,
  • or a pointer to a subobject representing a base class of such an object.

If not, the behavior is undefined.

由于对 operator new 的调用不是 new 表达式,我认为该行为是未定义的。

此外,“未定义行为”并不意味着它像您建议的那样依赖于实现(依赖于实现的事物在标准中被指定为“实现定义”)。未定义的行为就是这个意思,编译器可以为所欲为。检查这个问题:Undefined, unspecified and implementation-defined behavior

关于c++在请求特定字节的新之后删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58566814/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com