混合在堆和堆栈上创建的矢量对象
Mixing vector objects created on heap and on stack
我有一个相当简单的问题,但我无法理解。
考虑我有这个代码:
#include <iostream>
#include <vector>
using namespace std;
class B
{
public:
B(const int& val) {this->val = val;}
int val;
};
class A
{
public:
A() {}
void Set(B& ptb)
{
ptBs.push_back(&ptb);
}
void Set(const int& val)
{
ptBs.push_back(new B(val));
}
std::vector<B*> ptBs;
};
int main()
{
A* ptA = new A();
ptA->Set(B(10));
ptA->Set(38);
for (int i=0; i<ptA->ptBs.size(); i++)
cout << ptA->ptBs[i]->val << endl;
delete ptA;
system("pause");
return 0;
}
输出结果为:
10
38
但我认为,如果我不使用此方法创建的数组元素调用delete,那么void Set(const int& val)
中就会发生内存泄漏。
我怎么能说呢,std::vector的哪些元素已经在堆上创建了,所以我可以像这样在~A()析构函数中释放内存:
~A()
{
for (int i=0; i<ptBs.size(); i++)
delete ptBs[i];
}
我是否必须删除通过临时新操作调用创建的矢量元素?
也许我在这里看不到非常简单的东西,但我的应用程序中确实需要这个功能。
PS。图10和38只是一个简单的例子。Set
函数可以用不同的参数调用数千次。
幸运的是,这一行不会编译:
ptA->Set(B(10));
这是因为B(10)
是一个构造函数强制转换表达式,它创建类型为B
的prvalue临时;prvalue不能绑定到CCD_ 6的左值引用CCD_。这是C++语言,可以保护您免受存储指向临时值的悬挂指针的后果。
A
按值存储其B
项目通常更有意义:
std::vector<B> Bs;
您应该决定是否将类型为B
的对象的所有权授予A
的实例。两者混合不会带来任何好处。想象一下记录这个类:this class may or may not take ownership to the objects it holds.
我不推荐的另一种方法是创建指向B
的指针的包装器,该包装器使用指向B的指针和它构造函数中的布尔标志,布尔标志将指示指针是指向堆栈上分配的对象还是指向堆上的对象。
相关文章:
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有包含其他对象的类的对象创建顺序
- 为什么我们再次从结构对象创建结构变量?
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 如何为自定义模板对象创建专门的函数模板
- 对象创建错误的C++矢量
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 此类模板的对象创建如何工作?
- C++ 中的对象创建类型有什么区别?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 如何仅通过父类对象限制对象创建
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 无法将类对象创建为另一个类的成员
- 如何从现有基类对象创建派生类对象
- 在 DTor 之前删除的静态对象创建的线程?
- C++:定义多个构造函数时的对象创建/销毁序列
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 是否可以为CPP中的对象创建一组指针