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

为什么我得到 free(): 程序结束后指针无效错误

如何解决为什么我得到 free(): 程序结束后指针无效错误

有人能解释为什么我在程序结束后收到这个错误吗?

free(): 无效指针

这是我的代码

#include <iostream>
#include <memory>

int main()
{
    int a = 3;
    std::unique_ptr<int> up(&a);
    
    std::cout << a << std::endl;
    std::cout << *up << std::endl;
    
    std::cout << &a << std::endl;
    std::cout << up.get() << std::endl;
    
    return 0;
}

解决方法

std::unique_ptr<int> up(&a);

std::unique_ptr 的全部和全部目的,它存在的唯一原因,是当它超出范围并被销毁时,它会自动 delete 是它指向的任何东西(假设它已经'没有被移出)。

a 是在函数局部作用域中实例化的,而不是动态作用域,因此尝试 deletenew 的内容会导致未定义的行为和崩溃。>

,

这是一个独特指针的玩具模型:

struct toy_ptr {
    int* p;
    ~toy_ptr() { delete p; }
};

(“玩具”因为需要更多,而这只是重现您的问题所需要的)

现在如果你这样做:

int main() {

    int a = 0;
    toy_ptr ptr{&a};
}

toy_ptr 拥有 a 的所有权。拥有一个对象意味着:toy_ptr 负责在其析构函数中删除它。 a 未通过 new 分配,因此尝试通过 delete &a 删除它会调用未定义的行为。

unique_ptr 不是 toy_ptr,但它也拥有传递给构造函数的指针的所有权,并尝试在其析构函数中删除它。

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