我将有一个大型结构,其中包含基本类型、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 .
关于c++ - 包含对象的结构 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111653/