1

我想在 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 行收到运行时“分段错误”错误。群体向量似乎未初始化。为什么?

4

3 回答 3

8

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

void add_new(Cow *& cowp) 
于 2013-07-31T12:32:54.983 回答
4
void add_new(Cow* cowp)
{
        cowp = new Cow;
}

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

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

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

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

于 2013-07-31T12:33:30.290 回答
3

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

另一个重要的变化是你的函数必须引用指针:

void add_new(Cow*& cowp)

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

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

而且我实际上建议您根本不要使用指针,因此实际上不需要其他初始化。

于 2013-07-31T12:33:33.760 回答