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

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

概述我是从C#背景到C来的.假设我有一个方法在堆栈的方法中创建一个对象,然后我将它传递给另一个类方法,该方法将它添加到一个memeber向量. void DoStuff(){ SimpleObj so = SimpleObj("Data", 4); memobj.Add(so); }//In memobjvoid Add(SimpleObj& so){ memVec. 我是从C#背景到C来的.假设我有一个方法在堆栈的方法中创建一个对象,然后我将它传递给另一个类方法,该方法将它添加到一个memeber向量.
voID DoStuff(){    SimpleObj so = SimpleObj("Data",4);    memobj.Add(so); }//In memobjvoID Add(SimpleObj& so){   memVec.push_back(so); //boost::ptr_vector object}

这是我的问题:

>一旦DoStuff方法结束,那么会超出范围并从堆栈d出?
> 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.

总结

以上是内存溢出为你收集整理的在堆栈上创建一个对象,然后通过引用传递给C中的另一个方法全部内容,希望文章能够帮你解决在堆栈上创建一个对象,然后通过引用传递给C中的另一个方法所遇到的程序开发问题。

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

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

原文地址:https://54852.com/langs/1244364.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存