- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我意识到这是不明智的,我不打算这样做,但我很好奇以下行为是否实际上在形式上是非法的:
#include <iostream>
struct X
{
~X()
{
std::cout << "~X()\n";
}
};
int main()
{
X *x = new X;
//delete x;
x->~X();
::operator delete(x);
return 0;
}
我的理解是delete x;
相当于调用析构函数然后调用::operator delete(x);
,但是我这样做合法吗那手动按标准?我知道这对使用 placement new 是有效的,但是在非 placement 情况下呢?我的预感是它可能是非法的,因为必须为每个 new
执行 delete
(而不是 operator delete
),但我会有兴趣确定。
最佳答案
我很确定这不符合标准。标准(据我所知)中没有任何地方说 delete p;
的操作数直接传递给释放函数,对于 delete []
来说几乎可以肯定不会原封不动地通过。
但是,它可能适用于所有实际实现。
当然,您不应该显式调用全局释放函数。在您的示例中很好,它没有用户定义的分配和释放函数,但在一般情况下没有(实际上,是否有任何语法可以调用特定于类的释放函数(如果存在),否则调用全局释放函数? ).
另外,一般情况下,传递给deallocation函数的指针肯定不是delete的操作数。考虑:
struct A
{
virtual ~A() {}
};
struct B1 : virtual A {};
struct B2 : virtual A {};
struct B3 : virtual A {};
struct D : virtual B1, virtual B2, virtual B3 {};
struct E : virtual B1, virtual D {};
int main( void )
{
B3* p = new D();
p->~B3(); // should be ok, calling virtually
operator delete(p); // definitely NOT OK
return 0;
}
关于c++ - 在 C++ 中手动模拟 delete 运算符的效果是否正式非法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4422294/
我正在使用bootstrap templates与 angular-formly我想将 addonsLeft.text 绑定(bind)到模型,以便一旦选择选项发生更改,它就会动态更改。 这是输入的样
我正在尝试以 mm/dd/yyyy 格式向我的列添加一天,但它为我提供了 newdate 的空输出 日期1 = 27/03/2019 SELECT date1,DATE_ADD(CONCAT(date
我是一名优秀的程序员,十分优秀!