gpt4 book ai didi

C++:以下几种情况会不会内存泄漏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:08:08 25 4
gpt4 key购买 nike

标题就是问题。

我还是不太明白动态分配存储的行为。

#include <utility>
int main() {
// Case 1:
volatile char *c1 = new char; // I'm gonna make these volatile, so the compiler won't change the code.
volatile char *d1 = c1;
delete d1;
// Case 2:
volatile char *c2 = new char[4];
volatile char *d2 = c2;
delete []d2;
// Case 3:
volatile char *c3 = new char;
volatile char *d3 = std::move(c3);
delete d3;
// Case 4:
volatile char *c4 = new char[4];
delete c4++;
delete []c4;
// Case 5:
volatile char *c5 = new char[4];
for (int i = 0; i < 4; ++i)
delete c5++;
return 0;
}

在每种情况下都会发生内存泄漏吗?

最佳答案

案例 1 到 3:无泄漏。

案例 4 和案例 5;重新分配导致未定义的行为。您正在从一个不具有最初分配的值的指针中删除。

为什么 1 到 3 没有泄漏?您将适当的 deletedelete[] 与使用的 newnew[] 匹配;并且它们是成对匹配的,每个分配一个解分配。

我假设提供的示例很简单,用于演示分配,但请注意,指针没有被“重置”为 NULL(或 nullptr),因此一旦解除分配,对先前分配的内存的任何访问都是未定义的。


关于 std::move 的旁注,它是否使 c3 指针成为 nullptr?不,它没有。 std::move 实际上并没有“移动”任何东西,它只是改变了值类别,参见 this answersome sample code .

关于C++:以下几种情况会不会内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35132186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com