一个关于野指针的问题

prophetluo 2006-07-27 10:34:37
class A

{

public:

int x;

A(int e)

{

x=e;

}

void Func(void)

{

cout << "Func of class A"<<endl;



}

~A();

};

A::~A(){cout<<"qqqqqqqqqq"<<endl;}



void test6()

{

A *p;

p=NULL;

{

A a(10);

p = &a; // 注意 a 的生命期

//delete p;

}



// p是“野指针”

cout<<p->x<<endl;



}



void main()

{

test6();

}

汇编码

: A *p;

p=NULL;

004171D4 and dword ptr [p],0

{

A a(10);

004171D8 push 0Ah

004171DA lea ecx,[a]

004171DD call A::A (4110A5h)

p = &a; // 注意 a 的生命期

004171E2 lea eax,[a]

004171E5 mov dword ptr [p],eax

//delete p;

}

004171E8 lea ecx,[a]

004171EB call A::~A (4114C9h)



// p是“野指针”

cout<<p->x<<endl;

004171F0 push offset endl (411203h)

004171F5 mov eax,dword ptr [p]

004171F8 push dword ptr [eax]

004171FA mov ecx,offset cout (4328E4h)

004171FF call ostream::operator<< (411046h)

00417204 mov ecx,eax

00417206 call ostream::operator<< (411028h)



问题:是不是对象申请的内存是固定的 对象消失了那个地址也不消失啊 这个上面 对象a的地址是0x0012FDF4, p指向a后 a消亡 p还是指的那个地方

但是那个地方里面居然还有数据.我好像记得说是

对象1的数据
对象2的数据
对象3的数据
对象4的数据

对象的方法


的内存分配是这样的 所以原例子中用的调用函数 我改了下试着显示对象a的数据成员 结果还是一样的结果



qqqqqqqqqq

10

Press any key to continue



实在是崩溃 不知道怎么回事 希望大家赐教啊!!!1
...全文
227 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
prophetluo 2006-07-31
  • 打赏
  • 举报
回复
非常感谢大家!!!
我明白了
对象的a不存在了 但是内存中的东西还是在的 谢谢了
jixingzhong 2006-07-27
  • 打赏
  • 举报
回复
a 生命期在最接近的一对大括号之内,
到了外面,
a 是不存在的,
但是,
a 不存在,
p 仍是存在的,
p 的值没有被修改, 还是指向原来 a 所在的内存位置 ...
chenhu_doc 2006-07-27
  • 打赏
  • 举报
回复
来做做这个,把a的声明放到一个循环里面,
A a(10);
p = &a; //都执行一次,其他的为空循环,可以用if-else来做
//再看看p是否为野指针。.
chenhu_doc 2006-07-27
  • 打赏
  • 举报
回复
A *p;
p=NULL;
{
A a(10);
p = &a;
//delete p;
}
// p是“野指针”
cout<<p->x<<endl;\\我看a的作用域和p一样... 所以p不是野指针,

delete p; //这里释放...
OOPhaisky 2006-07-27
  • 打赏
  • 举报
回复
对象申请的内存一般是通过new或者malloc获得的,而new和malloc又调用操作系统提供的系统调用进行实际的内存分配。
此处malloc或者new的实现者很可能做一些优化,即他们会维护他们已经通过操作系统调用获得的内存,在程序调用delete或free“释放”内存时,他们并不调用“释放内存”的系统调用,而是将这些内存加上标记(表示他们已经被”释放”),在下次用户申请内存时就不必再次想操作系统申请了,将自己维护的“已释放内存”重新分配给用户就可以了。
al0n9 2006-07-27
  • 打赏
  • 举报
回复
void test6()
{
A *p;
p=NULL;
{
A a(10);
//a的生命周期是在此程序块中,意味着进入此块时,会调用A的构造函数,对a占用的内存空间进行初始化,而所a占用的内存空间在程序进入test6函数的时候就已经分配了,看一下反汇编代码,在进入test6时有如下几句:
004015F0 push ebp
004015F1 mov ebp,esp
004015F3 sub esp,48h
在这里,sub esp, 48h就是为p和a在栈中分配内存空间的。
在离开此程序块时,会调用A类的析构函数。a占用的内存空间仍然是有效的,在从函数test6()返回之前,a所占用的内存也不会被破坏。
p = &a; // 注意 a 的生命期

}
//此处,a的生命周期已经结束,但是a占用的内存空间仍然是有效的。所以下面的输入仍然正常。生命周期,只是语言中的规定,对象的生命周期结束,它占用的空间不一定被立即释放。
cout<<p->x<<endl;
}
内容概要:本文针对复杂威胁环境下多无人机的协同路径规划问题,提出一种基于多段杜宾斯(Dubins)路径的优化方法,旨在实现高动态、高风险场景中无人机群的安全、高效与协同飞行。研究充分考虑无人机的实际飞行约束,如最小转弯半径与连续曲率要求,采用杜宾斯曲线构建平滑且符合动力学特性的路径段,并结合优化算法对多机路径进行协同规划,有效规避静态威胁区域与动态障碍物,避免飞行器间发生碰撞。方案在Matlab平台上完成仿真验证,结果表明该方法能够在城市、军事等复杂环境中实现多无人机系统的路径最短化、能耗最低化、安全性最大化与实时性兼顾的多目标优化,具有较强的工程应用潜力。; 适合人群:具备无人机控制、路径规划或智能优化算法基础的科研人员与工程技术人员,特别适用于自动化、航空航天、机器人及相关领域的研究生、高校教师及工业界研发人员。; 使用场景及目标:①应用于复杂城市、战场等高威胁环境下的多无人机协同任务,如侦察监视、应急救援、集群打击与编队巡航;②为解决多无人机系统中的动态避障、冲突消解、路径平滑与资源协同分配等关键技术问题提供理论依据与算法实现参考;③帮助研究人员深入理解Dubins路径在多智能体协同运动规划中的建模方式与优化机制,推动其在无人系统自主导航中的实际落地。; 阅读建议:建议读者结合提供的Matlab代码深入研读算法实现流程,重点分析威胁建模策略、多机冲突协调机制以及多目标代价函数的设计思路,可通过调整环境参数与优化权重在仿真中观察路径生成效果,从而加深对协同决策、运动学约束与全局优化之间耦合关系的理解。
内容概要:本文围绕“基于飞机配电优化负荷管理系统研究”展开,利用Matlab代码实现相关建模仿真与优化分析,旨在提升飞机配电系统的效率与可靠性。研究重点针对飞机电力系统中的动态负荷分配问题,构建了综合考虑电源容量限制、负载优先级划分、供电安全性、能量消耗最小化及系统冗余能力的多约束优化模型。通过引入先进智能优化算法对模型进行高效求解,实现了对机载关键与非关键设备的科学化、智能化供电管理。文中详细展示了算法迭代过程、收敛性分析及不同工况下的仿真结果,验证了该方法在降低整体能耗、均衡电力负载、增强系统稳定性以及应对突发用电需求等方面的优越性能,为现代民用与军用航空器电力系统的自主决策与健康管理提供了坚实的理论支撑与可行的技术路径。; 适合人群:具备电力系统、自动化或航空航天工程背景,熟练掌握Matlab编程语言,从事飞机电气系统设计、航空器能源管理、智能优化算法应用或相关领域研究的科研人员、工程师及研究生。; 使用场景及目标:①应用于新型飞机电气系统的设计与仿真验证,优化机载设备的供电策略与能量管理逻辑;②为复杂封闭电力系统(如舰船、空间站)中的负荷调度与应急电源管理提供可借鉴的解决方案,以提升系统整体能效、安全等级与运行韧性。; 阅读建议:建议结合提供的Matlab代码深入理解优化模型的数学建模过程、约束条件的程序化表达及智能算法的具体实现细节,重点关注目标函数的设计思路、权重系数的选取对优化结果的影响,并可尝试将模型拓展至多目标优化、实时滚动优化或考虑设备故障预测的主动负荷管理等更复杂的应用场景。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧