在堆栈上分配的变量上调用delete忽略编程风格和设计,在堆栈上分配的变量上调用delete是“安全的”吗?例如: int nAmount;
delete &nAmount;要么class sample{public:
sample();
~sample() { delete &nAmount;}
int nAmount;}
3 回答
达令说
TA贡献1821条经验 获得超6个赞
好吧,我们来试试吧:
jeremy@jeremy-desktop:~$ echo 'main() { int a; delete &a; }' > test.cpp jeremy@jeremy-desktop:~$ g++ -o test test.cpp jeremy@jeremy-desktop:~$ ./testSegmentation fault
显然它根本不安全。
守着一只汪
TA贡献1872条经验 获得超3个赞
是的,它是未定义的行为:传递给delete
任何不是来自new
UB的东西:
C ++标准,第3.7.3.2.3节:提供给标准库中提供的一个释放函数的第一个参数的值可以是
null
指针值; 如果是这样,并且如果解除分配函数是标准库中提供的函数,则对释放函数的调用不起作用。否则,operator delete(void*)
标准库中提供的值应为先前调用operator new(std::size_t)
或operator new(std::size_t, const std::nothrow_t&)
在标准库中调用返回的值之一。
未定义行为的后果是未定义的。“没有任何事情发生”与其他任何事情一样有效。但是,它通常“没有立即发生”:解除分配无效的内存块可能会在后续调用分配器时产生严重后果。
- 3 回答
- 0 关注
- 637 浏览
添加回答
举报
0/150
提交
取消