处理包含动态分配成员的对象向量
Handling vectors of objects containing dynamically allocated members
假设我有一个包含动态分配成员的类,如下所示:
class example
{
private:
otherClass * pointer;
public:
example(int foo){ pointer = new otherClass(foo); }
~example(){delete pointer;}
};
//defining template parameter
example template(1);
现在假设我想动态地将模板对象push_back放入vector对象,如下所示:
std::vector<example> myVector;
for(int i=0; i<5; i++)
myVector.push_back(template);
myVector.erase(myVector.begin());
我的问题是:我如何准备类处理动态分配的指针?我知道我需要重载复制构造函数,但是我也需要重载复制赋值吗?那么move构造函数或move赋值呢?还有什么我忘了的预防措施吗?
有三种方法可以实现动态分配成员的复制:如何准备类来处理动态分配的指针?我知道我需要重载复制构造函数,但是我也需要重载复制赋值吗?那么move构造函数或move赋值呢?
- 通过将复制构造函数和赋值操作符设置为非私有或
delete
d来禁用复制。 - 通过使用具有共享所有权语义的指针对指针成员进行浅拷贝,例如
std::shared_ptr
。使用编译器生成的复制构造函数和赋值。 - 深拷贝。通过按值存储成员并使用编译器生成的复制构造函数和赋值,或者,对于指针成员,在用户定义的复制构造函数和赋值操作符中分配新的副本以及move重载。
我不确定我是否很好地理解了你的问题,所以我将首先讲述我所理解的内容。
- for循环后的向量包含5个对象。这些对象中的每一个都指向otherClass的同一个对象。
- 一旦你擦除一个对象,析构函数将被自动调用,otherClass的对象将被删除。
问题是vector中剩下的4个对象现在指向一些已经被删除的内存。
在我看来,你的问题的解决方案是改变你的类的定义和使用引用计数智能指针。
class example
{
private:
std::shared_ptr<otherClass> pointer;
public:
example(int foo) : pointer(new otherClass(foo)){ }
~example(){}
};
这样,只有删除vector中的第五个对象才会删除otherClass的对象。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 从多个源构造一个对象,包括一个对象向量
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 对象 C++ 向量的 STL 容器
- 初始化C++中的对象向量
- 从自定义类获取对象向量中的 max 元素
- 如何在 c++ 中打印存档中的对象向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 尝试重载输出运算符时,我无法遍历对象向量
- 如何在C++中打印对象向量的内容
- 打印出对象向量中的每个元素C++
- 在 c++ 的构造函数中分配对象向量时出错
- 遍历对象向量,并找到与从文本文件中提取的对象匹配的变量
- 对象向量是否在堆或堆栈上分配C++?
- 基于不同字段的对象向量的排序功能
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 用rapidjson读取子对象向量
- 尝试使用比较运算符对对象向量进行排序
- 如何用对象向量重载 cin(>>)
- 如何将某个元素从shared_ptr擦除到对象向量?