c++ - 在C++中如何将shared_ptr变量push_back到shared_ptrs vector ?

标签 c++ pointers scope stl smart-pointers

我是一名 C++ 初学者,拥有 Python、Java 和 JS 背景,因此我仍在学习指针方面的知识。

我有一个共享指针 vector 。在另一个函数内部,我将一个共享指针分配给一个变量并将其添加到 vector 中。如果我在该函数退出后尝试访问添加的元素,则会发生段错误:

class Bar
{
private:
    std::vector<std::shared_ptr<Foo>> fooVector;
}

void Bar::addToFoo()
{
    std::shared_ptr<Foo> foo (new Foo(…));
    fooVector.push_back(foo);
}
void Bar::otherMethod()
{
    // this method gets called sometime after addToFoo gets called
    …
    fooVector[anIndex]->baz(); // segfaults
    …
}

但是,如果 push_back 是共享指针而不是变量,则它可以工作。

// this works:
fooVector.push_back(std::shared_ptr<Foo>(new Foo(…)));

// this segfaults:
std::shared_ptr<Foo> foo (new Foo(…));
fooVector.push_back(foo);

我相信这是因为 fooaddToFoo时变量被删除函数退出(如果我错了请纠正我)。你好push_back一个shared_ptr 变量vectorshared_ptrs在 C++ 中?


为什么使用变量

尽管插入shared_ptr无需变量即可直接转换为 vector ,我更喜欢使用变量来执行此操作:

std::shared_ptr<Rider> rider;
switch (iProcessorModesParam)
{
    case PEAKS_MODE:
        rider = std::shared_ptr<Rider>(new PeaksRider(…));
        break;
    case RMS_MODE:
        rider = std::shared_ptr<Rider>(new RMSrider(…));
        break;
}
volumeRiders.push_back(rider);

PeaksRider 和 RMSrider 是 Rider 的子类。我想将骑手的所有子类型存储在同一个骑手 vector 中。我了解到,将 Rider 的子类型添加到 Riders vector 中是行不通的,需要指针才能实现这种多态性:

std::vector<Rider> // doesn’t work with subtypes

std::vector<*Rider>
std::vector<std::shared_ptr<Rider>>

拥有 std::shared_ptr<Rider> rider;变量避免重复.push_back(…)每种类型的骑手的代码。

最佳答案

用户使用reset方法而不是分配共享指针。

rider.reset(new PeaksRider(…));

除此之外,你的代码片段对我来说似乎没问题。

段错误可能是由于索引变量(可能超出范围)引起的。我建议您使用 .at(index) 从 vector 访问指针,并将该部分代码包装在 try..catch block 中,看看真正的错误是什么。

关于...

I believe it happens because the foo variable gets deleted when the addToFoo function exits (correct me if I’m wrong).

这不是真的,share_ptrs 使用本地计数器来表示 #of 引用。一旦您将指针插入 vector ,计数器就会增加到 2,并且在控制退出函数后发生事件,计数器就会减少到 1。因此,您的对象还没有被销毁。

关于c++ - 在C++中如何将shared_ptr变量push_back到shared_ptrs vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69891999/

相关文章:

c++ - 消息框发送 Windows 消息?

c++ - (C++)将 vector 保存到.txt数据库中的问题

c++ - 如果使用 g++,为什么 std::cout 可以转换为 void*?

c - 指向c中变量的低字节地址

c - 使用指向结构的指针实现冒泡排序

C++ 移动构造函数和作用域

c++ - 从返回 int c++ 的函数中获取二维数组

c++ - 在源文件中定义但在任何函数定义之外的变量的范围是什么?

bash - 如果源脚本在函数中运行,为什么 bash 变量不是全局变量?

c# - 将 C# void* 转换为 byte[]