c – 析构函数如何知道何时激活自身?它可以依靠吗?
比方说,我有以下代码(纯例):
class a { int * p; public: a() { p = new int; } ~a() { delete p; } }; a * returnnew() { a retval; return(&retval); } int main() { a * foo = returnnew(); return 0; } 在returnnew()中,在函数返回后(当retval超出范围时)会对retval进行破坏吗?或者它会在我返回地址后禁用自动销毁,我可以说删除foo;在main()的末尾?或者,以类似的方式(伪代码): void foo(void* arg) { bar = (a*)arg; //do stuff exit_thread(); } int main() { while(true) { a asdf; create_thread(foo,(void*)&asdf); } return 0; } 析构函数会去哪里?在哪里我要说删除?或者这是未定义的行为?唯一可行的解??决方案是使用STL引用计数指针吗?这将如何实施? 谢谢 – 我已经使用了C一段时间但从未遇到过这种情况,并且不想创建内存泄漏. 解决方法
对于堆栈创建的对象,当对象超出范围时,将自动调用析构函数.
对于在堆上创建的对象,只有在显式调用delete时才会释放内存. 是否从函数返回堆栈创建对象的地址无关紧要.当项目超出范围时,仍将调用析构函数. 所以对于你的代码示例: a * returnnew() { a retval; return(&retval); } 在代码跳转回调用returnnew()的代码之前调用析构函数.您返回该对象的地址,但该地址指向内存中不再属于您的位置.
您只在使用new时使用delete
如何处理不属于您的内存地址将是未定义的行为.但这不是正确的代码.
您可以按值返回对象,也可以在堆上创建新对象.您还可以通过参数将对象传递给函数,并要求函数更改它.
//Shows how to fill an object's value by reference void fillA(a& mya) { mya.var = 3; } //Shows how to return a value on the heap a* returnNewA() { //Caller is responsible for deleting the returned pointer. return new a(); } //Shows how to return by value,memory should not be freed,copy will be returned a returnA() { return a(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 如何使用rspec测试控制器方法?
- quick-cocos2d-x 3.3 gradle eclipse 打包
- ruby-on-rails – 使用Elasticsearch / Tire通过
- ajax – Trigger.IO应用程序的跨域错误,即使设置
- cocos2dx android 5.0系统崩溃问题
- Oracle使用count max condition创建表为select
- 当我尝试使用Ivy解决依赖关系时,我的Ant构建会挂
- swift – 将nil Dates排序到数组的末尾
- actionscript-3 – 将对象带到前面的flash动作脚
- 利用Flex 4.5 SDK和Flash Builder 4.5开发的web和