为了账号安全,请及时绑定邮箱和手机立即绑定

在堆栈上分配的变量上调用delete

在堆栈上分配的变量上调用delete

C++
斯蒂芬大帝 2019-08-08 17:09:14
在堆栈上分配的变量上调用delete忽略编程风格和设计,在堆栈上分配的变量上调用delete是“安全的”吗?例如:   int nAmount;    delete &nAmount;要么class sample{public:     sample();     ~sample() { delete &nAmount;}     int nAmount;}
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

,调用delete堆栈分配的变量是不安全的。你应该只调用delete创建的东西new

  • 对于每个malloc或者calloc,应该只有一个free

  • 每个new应该只有一个delete

  • 每个new[]应该只有一个delete[]

  • 对于每个堆栈分配,应该没有明确的释放或删除。在适用的情况下,会自动调用析构函数。

在一般情况下,你不能随意搭配任何这些,例如没有free-ing或delete[]-ing一个new对象。这样做会导致未定义的行为。


查看完整回答
反对 回复 2019-08-08
?
达令说

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

显然它根本不安全。


查看完整回答
反对 回复 2019-08-08
?
守着一只汪

TA贡献1872条经验 获得超3个赞

是的,它是未定义的行为:传递给delete任何不是来自newUB的东西:

C ++标准,第3.7.3.2.3节:提供给标准库中提供的一个释放函数的第一个参数的值可以是null指针值; 如果是这样,并且如果解除分配函数是标准库中提供的函数,则对释放函数的调用不起作用。否则,operator delete(void*)标准库中提供的值应为先前调用operator new(std::size_t)operator new(std::size_t, const std::nothrow_t&)在标准库中调用返回的值之一。

未定义行为的后果是未定义的。“没有任何事情发生”与其他任何事情一样有效。但是,它通常“没有立即发生”:解除分配无效的内存块可能会在后续调用分配器时产生严重后果。


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 637 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信