C++ 以下哪一项是更好的练习?

C++ 以下哪一项是更好的练习?,c++,vector,C++,Vector,比如说我有一门课 我想要一个FOO的std::vector 如果我这样做是否更好: FOO foo; foo.init(); foo.prop = 1; std::vector<FOO> myvec; myvec.push_back(foo); foo.prop = 2; myvect.push_back(foo); FOO-FOO; foo.init(); foo.prop=1; std::载体myvec; myvec.push_back(foo); foo.prop=2; m

比如说我有一门课

我想要一个FOO的
std::vector

如果我这样做是否更好:

FOO foo;
foo.init();
foo.prop = 1;
std::vector<FOO> myvec;

myvec.push_back(foo);
foo.prop = 2;
myvect.push_back(foo);
FOO-FOO;
foo.init();
foo.prop=1;
std::载体myvec;
myvec.push_back(foo);
foo.prop=2;
myvect.push_back(foo);
还是更好的做法是:

std::vector<FOO> myvec;
FOO foo;
myvec.push_back(foo);
myvec.back().init();
myvec.back().prop = 1;

myvec.push_back(foo);
myvec.back().init();
myvec.back().prop = 2;
std::vector myvec;
富富,;
myvec.push_back(foo);
myvec.back().init();
myvec.back().prop=1;
myvec.push_back(foo);
myvec.back().init();
myvec.back().prop=2;
我基本上不确定创建一个模型并推入模型是否比创建一个实例、推入它然后从向量修改它更好。另外,哪一个更安全,最不可能导致内存泄漏


谢谢,最佳实践是不要使用init()函数-您需要一个构造函数。如果您总是需要设置prop,请为构造函数提供一个参数。这与向量没有任何关系——它是所有C++代码都应该被写入的方式。

这两种方法都没有任何内存问题,因为你处理的是值,而不是手动分配任何对象。 我倾向于给
FOO
一个构造函数,它执行
init
所做的任何事情,并将
prop
设置为适当的值。然后,您只需推送所需的值:

myvec.push_back(FOO(1));
myvec.push_back(FOO(2));

我认为最好的办法是:

myvec.push_back(FOO(1));
myvec.push_back(FOO(2));

答案取决于你的
FOO
类做什么。如果它是一个没有指针等的简单结构,那么您的两种方法都很好,并且都是一样的

请注意,
push_back
将对象的副本插入向量中。如果类在堆上分配内存,则需要一个复制构造函数来创建对象的深度副本,否则将导致内存泄漏。此外,如果对象很大,则创建副本的效率可能会很低。在这种情况下,我通常会在堆外部分配对象本身,并将指针插入向量:

std::vector<FOO *> myvec;
FOO *foo;

foo = new FOO();
foo->init();
foo->val = 1;
myvec.push_back(foo);

foo = new FOO();
foo->init();
foo->val = 2;
myvec.push_back(foo);
std::vector myvec;
FOO*FOO;
foo=新的foo();
foo->init();
foo->val=1;
myvec.push_back(foo);
foo=新的foo();
foo->init();
foo->val=2;
myvec.push_back(foo);

但是,在这种情况下,您需要记住在销毁向量之前释放对象。

除了其他人所说的在构造函数中初始化对象之外,我还要添加以下内容:

在第二个示例中,将对象放入向量中,然后对其进行初始化,可能会使向量处于不可用状态

例如,如果init()方法可以抛出异常,那么向量中将包含一个未初始化/部分初始化的对象

当然,这些问题可以通过确保对象正确初始化的构造函数解决


一般来说:不要在对象处于可用状态之前开始处理它们。

为什么Foo::Foo()不调用Foo::init()?如果你发布一个具体的Foo类可能会有所帮助。除非你使用new而不使用delete,否则不会发生内存泄漏。