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

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

忽略编程风格和设计,在堆栈上分配的变量上调用delete是“安全的”吗?

例如:

   int nAmount;
   delete &nAmount;

要么

class sample{public:
    sample();
    ~sample() { delete &nAmount;}
    int nAmount;}


斯蒂芬大帝
浏览 638回答 3
3回答

子衿沉夜

不,调用delete堆栈分配的变量是不安全的。你应该只调用delete创建的东西new。对于每个malloc或者calloc,应该只有一个free。每个new应该只有一个delete。每个new[]应该只有一个delete[]。对于每个堆栈分配,应该没有明确的释放或删除。在适用的情况下,会自动调用析构函数。在一般情况下,你不能随意搭配任何这些,例如没有free-ing或delete[]-ing一个new对象。这样做会导致未定义的行为。

达令说

好吧,我们来试试吧:jeremy@jeremy-desktop:~$ echo 'main() { int a; delete &a; }' > test.cpp jeremy@jeremy-desktop:~$ g++ -o test test.cpp jeremy@jeremy-desktop:~$ ./testSegmentation fault显然它根本不安全。

守着一只汪

是的,它是未定义的行为:传递给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&)在标准库中调用返回的值之一。未定义行为的后果是未定义的。“没有任何事情发生”与其他任何事情一样有效。但是,它通常“没有立即发生”:解除分配无效的内存块可能会在后续调用分配器时产生严重后果。
打开App,查看更多内容
随时随地看视频慕课网APP