我将有一个包含基本类型的大型结构,STL对象(std :: string)以及库类的对象(我无法修改)。
struct Info {
string name;
int number;
LibClass object;
// ...
}
我想将这个结构的实例填充到一个向量中,然后创建一个函数来填充这个向量。
vector<Info> list;
void addElement (string myName, int myNumber, LibClass myObject /*, ... */)
{
Info newElement = { myName, myNumber, myObject /*, ... */};
list.push_back(newElement);
}
上面的代码将失败,因为LibClass没有指定向量实现所需的赋值运算符。
如果我更改我的struct(和addElement
函数参数)以保存指向LibClass对象的指针,代码将起作用。但是我必须在我的函数之外进行内存管理(在堆上为每个新元素创建一个LibClass对象)。
接下来最好的事情是在addElement
函数内部通过在堆上创建给定堆栈对象的副本来执行内存管理,这将使我的调用代码保持干净。但是因为这段代码不是另一个对象的一部分,所以我没有析构函数,我可以再次释放内存。
有没有一种方法可以实现这一点,而无需在此代码之外进行内存分配,而不必将其作为一个功能齐全的工厂类?
更新:我无法修改库类,我无法使用C ++ 11或助手库,如boost。结构在向量内基本上是只读的。即使向量只会被填充一次,那么只会进行读取访问。
答案 0 :(得分:4)
如果我理解了所有内容,您可以考虑使用std::shared_ptr<>
。您将能够动态分配库,但释放将自动完成。
我想过用LibClass object;
替换std::shared_ptr<LibClass> object;
并在LibClass
函数中实例化addElement
。信息将是可复制的,因为shared_ptr
可以移动和复制自身 - 每个副本仍将保留对同一LibClass
实例的引用。而另一方面,当您删除单个Info
项目的所有实例(无论如何)时,shared_ptr
也将负责删除LibClass
实例。可以将shared_ptr
视为动态创建类的一种方式,然后将其留给自动内存管理。
由于std::shared_ptr<>
是C ++ 11的一部分,如果你不能使用后者,你可以使用Boost中的等价物:boost::shared_ptr<>
。如果这也不是一个选项,您可以自己实现一个共享指针版本 - example。
答案 1 :(得分:1)
你显然已经有了一个复制构造函数,否则按值传递会失败。因此,向量增长不应成为问题(尽管您可能必须避免从向量的开头或中间删除元素)。
对于构造,您可以在C ++ 11中使用emplace_back
。