指针向量中的for_each指针

for_each pointer in a vector of pointers

本文关键字:指针 each for 向量      更新时间:2023-10-16

我想初始化for_each()函数中的指针向量:

#include <stdlib.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class Cow{
        public:
                Cow(){ _age = rand()% 20; }
                int get_age() { return _age;}
        private:
                int _age;
};
void add_new(Cow* cowp)
{
        cowp = new Cow;
}
int main()
{
        srand(time(NULL));
        const int herd_size=10;
        vector<Cow*> herd(herd_size);
        for_each(herd.begin(), herd.end(),add_new);
        cout << "Age: " << herd[0]->get_age() << endl; // line 27
}

然而,我在第27行得到一个运行时"Segmentation fault"错误。群体病媒似乎未经免疫处理。为什么?

函数按值接收指针,然后重新分配这些副本。为了影响向量中的指针,您需要通过引用来接受它们。

void add_new(Cow *& cowp) 
void add_new(Cow* cowp)
{
        cowp = new Cow;
}

您只是在修改Cow指针的本地版本。请记住,一个局部变量在离开其函数时会被销毁,在这里,您的指针将作为值传递!

您想要修改向量中的指针,因此需要引用:

void add_new(Cow *& cowp)
{
  cowp = new Cow;
}

这样,就可以有效地修改向量中的原始指针。

对于这个std::generate是更好的匹配,因为它应该用于生成序列。

另一个重要的变化是,您的函数必须对指针进行引用

void add_new(Cow*& cowp)

实际上,由于新的C++11功能,您实际上不需要使用std::for_each甚至std::transform,也不需要使用单独的创建函数:

for (auto& cow : herd)
    cow = new Cow;

实际上,我建议不要使用指针,这样就不需要其他初始化了。