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 – 悬空指针示例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)