c++ - 指针动态分配(核心转储)

标签 c++ pointers

请帮助我哪里出错了,下面是我的代码,在删除或释放 x 之前它工作正常但在删除 x 之后它显示我已转储核心。我不知道为什么。我所做的是,我用 new 关键字在堆中分配了 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;

关于c++ - 指针动态分配(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22225850/

相关文章:

C++, std::transform 按索引替换项目

c++ - 操作不同类型变量的速度有什么区别吗?

android - 用于 linux 平台的中间件 android 开发的模拟器

C++在函数声明中错误两种或多种数据类型

c++ - 在 Fedora 20 x86_64 上编译 32 位 Linux 应用程序时使用 sndfile 库

c++ - 用 C 封装 C++ 接口(interface)

c++ - 删除cpp中的一个指针和new运算符

c++ - 将指针从一种基类型转换为另一种

c - C数组的打印地址

c - 指向数组的指针,二维数组和一维数组的区别