c – 悬空指针示例

c – 悬空指针示例,第1张

概述在下面的代码中,为什么s1.printVal会导致悬空指针错误?是不是s1对象,即它的指针,在它被销毁之前仍然可以访问? class Sample{ public: int *ptr; Sample(int i) { ptr = new int(i); } ~Sample() { delete ptr; 在下面的代码中,为什么s1.printVal会导致悬空指针错误?是不是s1对象,即它的指针,在它被销毁之前仍然可以访问?
class Sample{  public:    int *ptr;    Sample(int i)    {        ptr = new int(i);    }    ~Sample()    {        delete ptr;    }    voID Printval()    {        cout << "The value is " << *ptr;    }};voID SomeFunc(Sample x){    cout << "Say i am in someFunc " << endl;}int main(){    Sample s1 = 10;    SomeFunc(s1);    s1.Printval(); // dangling pointer}

Source

解决方法 这里的问题是为SomeFunc()的参数完成的副本.该副本在销毁时取消分配指针.您还需要实现复制构造函数和复制赋值运算符.见 rule of three.

编辑:

这是“扩展”的伪代码,即编译器在main()函数中为您做的事情:

// mainaddr0 = grab_stack_space( sizeof( Sample )); // alloc stack space for s1Sample::ctor( addr0,10 );                   // call ctor of Sampleaddr1 = grab_stack_space( sizeof( Sample )); // alloc stack for argumentSample::ctor( addr1,addr0 );                // call copY-ctor of SampleSomeFunc( addr1 );                           // call SomeFuncSample::dtor( addr1 );                       // XXX: destruct the copyfree_stack_space( addr1,sizeof( Sample ));  // free stack taken by copySample::PrintVal( addr0 );                   // call member func on s1Sample::dtor( addr0 );                       // destruct s1free_stack_space( addr0,sizeof( Sample ));  // YYY: free stack taken by s1

这不是确切的表示,而是概念性的解释.只需考虑编译器与代码有什么关系.

在标有XXX的步骤中删除Sample的指针成员,然后在步骤YYY再次删除ed.

总结

以上是内存溢出为你收集整理的c – 悬空指针示例全部内容,希望文章能够帮你解决c – 悬空指针示例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1238024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存