//Using g++ and ubuntu.
#include <vector>
using namespace std;
定义一个类:
class foo(){
(...)
foo(int arg1, double arg2);
}
构造
foo::foo(int arg1, double arg2){
(...) //arrays whose length depend upon arg1 and arg2
}
我想做这样的事情:
vector<foo> bar(10); //error: no matching function for call to 'foo::foo()'
bar[0] = new foo(123, 4.56);
(...)
另一种方法(我更喜欢)是使用push_back:
vector<foo> bar; //works
bar.push_back(new foo(123, 4.56)); //throws similar error.
//Omitting the "new" compiles but throws a "double free or corruption (fasttop)" on runtime.
我希望矢量的不同元素的构造方式不同,所以我不想使用“重复序列构造函数”。 该怎么办?
答案 0 :(得分:4)
为什么在不需要创建动态内存时使用new
?当然使用new
会失败,当foo*
接受push_back
时会导致foo
。 (毕竟,这就是你的载体。)
push_back
出了什么问题?如果您想预先保留内存,请使用reserve()
;在vector
的构造函数中提供一个数字会产生第二个参数的许多副本(隐式foo()
,这将不起作用,因此您的错误),这与简单地保留内存不同
如果正确处理(没有new
)崩溃,则错误在您的代码中,而不是向量。您可能还没有编写适当的类来管理资源。*(请记住The Big Three,请使用copy-and-swap idiom。)
*我这样说是因为你说“//arrays whose length depend upon arg1 and arg2
”,我怀疑这意味着你的班级里有new[]
。没有三巨头,您的资源管理将失败。
无论如何你不应该管理资源,课程有责任。这意味着它应该是动态数组,或者使用动态数组,但不能同时管理和使用动态数组。因此,将资源分解到自己的类中,然后创建另一个使用它们的类(您的)。动态数组是std::vector
,所以你已经完成了。 任何时间需要动态数组,使用vector
;没有理由不去。
答案 1 :(得分:4)
vector<foo> bar(10); //error: no matching function for call to 'foo::foo()'
这是失败的,因为您正在调用的std::vector
构造函数是
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
正如您所看到的,它正试图用向默认构造函数foo
的10个调用来填充向量,这个构造函数不存在。
此外,所有以new
为主题的示例都将失败,因为该向量需要foo
类型的对象,而不是foo *
。此外,除非在清除向量之前手动vector<foo *>
每个成员,否则更改为delete
也会失败。如果你真的想去动态内存分配路由,请创建一个vector< shared_ptr< foo > >
。 Boost libraries中提供了shared_ptr
,或者如果您的编译器包含TR1库,它将出现在<memory>
命名空间中的std::tr1
标头中,或者如果您的编译器具有C ++ 0x库将在std
名称空间本身中可用。
您应该做的是以下内容:
vector<foo> bar;
bar.reserve(10);
bar.push_back( foo( 1, 2 ) );
...
...
bar.push_back( foo( 10, 20 ) ); //10 times
答案 2 :(得分:0)
std :: vector总是根据您在上面的代码片段中未定义的默认构造函数创建元素。
push_back方法面临双重免费问题,因为您没有处理复制构造函数。