gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:25 26 4
gpt4 key购买 nike

我是从 C# 背景转到 C++ 的。假设我有一个方法在堆栈上的一个方法中创建一个对象,然后我将它传递给另一个类方法,该方法将它添加到一个成员 vector 中。

void DoStuff()
{
SimpleObj so = SimpleObj("Data", 4);
memobj.Add(so);
}

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

这是我的问题:

  1. 一旦 DoStuff 方法结束,so 是否会超出范围并从堆栈中弹出?
  2. memVec 有一个指向 so 的指针,但它被弹出这里发生了什么?
  3. 将堆栈对象传递给将它们存储为指针的方法的正确方法是什么?

我意识到这些对于具有一定经验的 C++ 程序员来说可能是显而易见的。

标记

最佳答案

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

实现您正在尝试做的事情的最简单方法是将对象的拷贝存储在普通的 STL 容器中(例如 std::vector)。如果这些对象是重量级的并且复制成本很高,您可能希望将它们分配到堆上,将它们存储在一个包含足够智能指针的容器中,例如boost::shared_ptr(参见 @Space_C0wb0y's answer 中的示例)。

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

关于c++ - 在堆栈上创建一个对象,然后通过引用传递给 C++ 中的另一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3759119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com