指针动态分配(核心倾倒)
Pointers dynamic Allocation (core dumped)
请帮助我在我出错的地方,下面是我的代码,在删除或释放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
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 指针动态分配(核心倾倒)