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

在堆栈上创建一个对象,然后通过引用传递给C中的另一个方法

发布时间:2020-12-16 05:04:05 所属栏目:百科 来源:网络整理
导读:我是从C#背景到C来的.假设我有一个方法在堆栈的方法中创建一个对象,然后我将它传递给另一个类方法,该方法将它添加到一个memeber向量. void DoStuff(){ SimpleObj so = SimpleObj("Data",4); memobj.Add(so); }//In memobjvoid Add(SimpleObj so){ memVec.pus
我是从C#背景到C来的.假设我有一个方法在堆栈的方法中创建一个对象,然后我将它传递给另一个类方法,该方法将它添加到一个memeber向量.
void DoStuff()
{
    SimpleObj so = SimpleObj("Data",4);
    memobj.Add(so); 
}

//In memobj
void Add(SimpleObj& so)
{
   memVec.push_back(so); //boost::ptr_vector object
}

这是我的问题:

>一旦DoStuff方法结束,那么会超出范围并从堆栈弹出?
> memVec有一个指针,但它突然发生在这里发生的事情?
>将堆栈对象传递给将它们存储为指针的方法的正确方法是什么?

我意识到这些对于C程序员来说可能是显而易见的.

标记

解决方法

>是的.
>指针保持“活着”,但指向不再存在的对象.这意味着,当您第一次尝试取消引用此类指针时,您将进入未定义的行为(可能您的程序将崩溃,或者更糟糕的是,将继续运行给出“奇怪”结果).
>如果要在返回函数后保留它们,则根本不这样做.这就是使用堆分配和存储对象副本的容器的原因.

实现您要做的事情的最简单方法是将对象的副本存储在普通的STL容器中(例如std :: vector).如果这些对象重量级且复制成本高,则可能希望在堆上分配它们将它们存储在具有足够智能指针的容器中,例如,boost :: shared_ptr(参见@Space_C0wb0y’s answer中的示例).

另一种可能性是将boost :: ptr_vector与boost :: ptr_vector_owner结合使用;最后一个类负责“拥有”存储在关联的ptr_vector中的对象,并在超出范围时删除所有指针.有关ptr_vector和ptr_vector_owner的更多信息,您可能需要查看this article.

(编辑:李大同)

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

    推荐文章
      热点阅读