我将拥有一个大型结构,其中包含基本类型,STL对象(std::string)以及库类的对象(无法修改)。

struct Info {
             string name;
             int  number;
             LibClass object;
             // ...
}

我想将此结构的实例填充到 vector 中,然后创建一个函数来填充该 vector 。
vector<Info> list;

void addElement (string myName, int myNumber, LibClass myObject /*, ... */)
{
  Info newElement = { myName, myNumber, myObject /*, ... */};
  list.push_back(newElement);
}

上面的代码将失败,因为LibClass没有指定 vector 实现所需的分配运算符。
如果我更改结构(和addElement函数参数)以保存指向LibClass对象的指针,则该代码将起作用。但是然后我将不得不在函数之外进行内存管理(在堆上为每个新元素创建一个LibClass对象)。

第二件事是通过在堆上创建给定堆栈对象的副本来在addElement函数内部进行内存管理,这将使我的调用代码保持整洁。但是由于此代码不是另一个对象的一部分,因此我没有析构函数可以再次释放内存。

有没有一种方法可以实现此目的而不必在代码之外进行内存分配,也不必将其分解为功能齐全的工厂类?

更新:我无法修改库类,我无法使用C++ 11或boost等辅助库。 vector 内部的结构基本上是只读的。甚至 vector 也只会被填充一次,那么只会发生读访问。

最佳答案

如果我正确理解了所有内容,那么您可能会考虑使用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

10-04 21:28