是否缺少删除未定义的行为? [复制]

Posted

技术标签:

【中文标题】是否缺少删除未定义的行为? [复制]【英文标题】:Is missing delete undefined behaviour? [duplicate] 【发布时间】:2014-07-30 22:50:55 【问题描述】:

当我分配内存而不调用delete时,这是未定义的行为吗?

例子:

int main(int argc, char** argv) 
    int* a = new int[1];
    // next code only to prevent optimization (hopefully)
    *a = argc; std::cout << *a << std::endl;
    // no delete
    return 0;

(让我们假设new 未优化)。

【问题讨论】:

不,这是定义的行为:内存泄漏。由于您的程序随后立即退出,但操作系统仍会回收其所有内存。 优化输出是什么意思? @juanchopanza:谢谢你的链接,没有找到它是搜索... 【参考方案1】:

这不是未定义的行为;这是内存泄漏。

当然,只要进程仍在运行,泄漏就“存在”;在这种情况下,进程立即退出(并且泄漏的概念变得毫无意义)。

【讨论】:

我会说这是未定义的行为,因为程序依赖于调用析构函数的副作用(即,如果不调用程序可能会耗尽内存。)但它不是不是很清楚。 谁对此投了反对票,为什么?我想了解一个陈述是错误的还是什么? (赞成) @juanchopanza:对不起,什么?该程序显然不依赖任何副作用,开始时没有析构函数,因为int[] 不是类类型,内存不足也不是未定义的行为。 抱歉,我脑子里还有a similar, recent question,其中的数组是std::string之一。

以上是关于是否缺少删除未定义的行为? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在已删除指针上调用非虚拟成员函数是未定义的行为?

堆栈对象的“删除”行为是啥? [复制]

C 中的 sum+++i 是未定义的行为吗? [复制]

删除 null void* 指针是未定义的行为吗?

是否打印空指针未定义行为?

何时在空实例上调用成员函数会导致 C++11 中的未定义行为? [复制]