指针动态分配(核心倾倒)

Pointers dynamic Allocation (core dumped)

本文关键字:核心 动态分配 指针      更新时间:2023-10-16

请帮助我在我出错的地方,下面是我的代码,在删除或释放x之前,它工作正常,但是删除x后,它显示我的核心已丢弃。我不知道为什么。我所做的是,我用新的关键字分配了2个变量,但是p = x,这意味着P现在保留x的地址。然后我释放P,最后我释放了X。请帮助我出错的地方。

#include <iostream>
using namespace std;

int main(){
int a;
int *b=&a;
cout<<b<<endl;//address of a
int *x=new int;
cout<<x<<endl;
cout<<*x<<endl;
int *p=new int;
*x=10;
*p=12;
p=x;
cout<<p<<endl;
cout<<x<<endl;
cout<<*p<<endl;
cout<<*x<<endl;
*x=13;
cout<<*p<<endl;
delete p;
*x=14;
cout<<*x<<endl;
cout<<*p<<endl;

delete x;

return 0;
}

p=x;,p和x指向同一位置(最初指向的一个x)。在任何一个上呼叫delete都会呈现另一个悬挂并在其上调用delete会导致双免费和未定义的行为。p=x也将导致内存泄漏,因为先前分配给p的内存不再可触及。

仅分配值,而不是指针,做

*p = *x;

问题是,您两次删除相同的指针或更准确地说是由两个指针指向的相同内存区域。

语句之后

p=x;

两个指针P和X都开始指向同一内存区域。然后您首先删除p

delete p;

之后您删除x

delete x;

但是,当您删除p。

时,X指向的内存已经被释放

删除P之后,所有随后的代码都具有未定义的行为

*x=14;
cout<<*x<<endl;
cout<<*p<<endl;

delete x;

要避免此问题,您可以使用智能指针std::shared_ptr

例如

#include <iostream>
#include <memory>

int main() 
{
    std::shared_ptr<int> x( new int );
    std::shared_ptr<int> p( new int );
    *x = 10;
    *p = 12;
    p = x;
    std::cout << p << std::endl;
    std::cout << x << std::endl;
    std::cout << *p << std::endl;
    std::cout << *x << std::endl;
    *x = 13;
    std::cout << *p << std::endl;
    *x = 14;
    std::cout << *x << std::endl;
    std::cout << *p << std::endl;

    return 0;
}

输出为

0x95e6008
0x95e6008
10
10
13
14
14