微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++:删除由 new 创建的指针时的内存问题

如何解决C++:删除由 new 创建的指针时的内存问题

我对下面的代码有点困惑

int main()
{
    int* a = new int{12};
    int* b = new int;

    b = a;
    delete a;

    delete b;

    return 0;
}

代码返回一个错误

a.out(27538,0x10ade7e00) malloc: *** error for object 0x7f8c18504160: pointer being freed was not allocated
a.out(27538,0x10ade7e00) malloc: *** set a breakpoint in malloc_error_break to debug
zsh: abort      ./a.out

我的问题是,当我删除 a 时,它会自动删除 b 吗?这里的机制是什么,我有点迷路了。

解决方法

b = a;    // here the int that b pointed at "leaks" (you have no way of deleting it)

delete a; // here "a" is deleted first

delete b; // here "a" is deleted a second time (undefined behavior)

当您将 a 的值分配给 b 时,先前包含的值(地址,如果您愿意)b 会被遗忘。然后 ab 都指向同一个对象。然后,您失去了 delete 原始对象 b 指向的所有可能性。当您然后 delete b 时,实际上您尝试再次删除 a

,

让我们一行一行地浏览代码。

int* a = new int{12};

这会创建一个类型为 a 的名为 int* 的新变量,并将其初始化为指向一个新分配的整数,赋值为 12。

int* b = new int;

这会创建一个名为 bint* 类型的新变量,并将其初始化为指向一个新分配的整数。

b = a;

这会将 b 的值更改为指向 a。第二次调用 new 时返回的值现在丢失了,内存泄漏,因为不再可能将其传递给 delete

delete a;

这将删除 a 指向的对象,即第一个分配的对象。

delete b;

糟糕,这会尝试删除 b 指向的对象,但 b 不指向当前存在的任何对象。第一个分配的刚刚被删除,并且不存在指向第二个的指针。所以这是一个错误。

我怀疑您认为 delete a; 会删除 a。它不是。它删除 a 指向的任何对象,并要求 a 是一个指针并指向一个用 new 分配的有效对象。

,

当你删除一个指针时,所有指向被销毁对象的指针、引用、迭代器等都将失效。因为赋值b = a,b和a指向同一个对象,所以当a被删除时,b就失效了。删除无效指针具有未定义的行为。

请注意,b = a 使得无法删除 b 之前指向的分配。这称为内存泄漏。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。