加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 析构函数如何知道何时激活自身?它可以依靠吗?

发布时间:2020-12-16 10:16:38 所属栏目:百科 来源:网络整理
导读:比方说,我有以下代码(纯例): 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超出范围时)会对r
比方说,我有以下代码(纯例):

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()的代码之前调用析构函数.您返回该对象的地址,但该地址指向内存中不再属于您的位置.

Where would i have to say delete?

您只在使用new时使用delete
如果你使用new [],你只能使用delete []

or is this undefined behavior?

如何处理不属于您的内存地址将是未定义的行为.但这不是正确的代码.

Would the only possible solution be to use the STL referenced-counted pointers?

您可以按值返回对象,也可以在堆上创建新对象.您还可以通过参数将对象传递给函数,并要求函数更改它.

how would this be implemented?

//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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读