很抱歉,如果我的上一个问题非常相似,但我还有另一个查询,说明何时以及是否应该使用delete关键字.
示例代码.
我初始化一个类,它指向指针向量作为参数.这些对象从堆中分配内存.然后我将这些对象传递给我的类构造函数,该构造函数也从堆中分配内存.
这是代码:在main函数中
//This will also change each loop
vector<A*>* ex1 = new vector<A*>;
vector<B*>* ex2 = new vector<B*>;
vector<C*>* ex3 = new vector<B*>;
for(int i =0; i < 10; i++){
ex1->push_back( new A(i); );
ex2->push_back( new B(i); );
ex3->push_back( new C(i); );
}
MainClass* ex_main = new MainClass(ex1,ex2,ex3);
Run Code Online (Sandbox Code Playgroud)
在MainClass.cxx中
MainClass::MainClass(vector<A*>* ex_A, vector<B*>* ex_B, vector<C*>* ex_C): m_ex_A(ex_A), m_ex_B(ex_B), m_ex_C(ex_C) {}
Run Code Online (Sandbox Code Playgroud)
在MainClass.h中
vector<A*>* m_ex_A;
vector<B*>* m_ex_B;
vector<C*>* m_ex_C;
Run Code Online (Sandbox Code Playgroud)
m_ex1,m_ex2和m_ex3已分配给堆栈,但已分配给指针向量的指针.
问题.
我是否删除了类MainClass的析构函数中的m_ex_A,B ans C(我知道我还需要删除每个向量中的元素)以及指向main函数中指针向量的指针吗?
在MainClass的析构函数中的ex(我做了一些比这更通用的东西,但这更快地显示)
for(int i = 0; i < m_ex_A->size(); i++){
delete m_ex_A->at(i);
}
delete m_ex_A;
Run Code Online (Sandbox Code Playgroud)
然后我会做一个类似的方法来指向主函数中指针ex1,ex2,ex3的向量,并删除主类.
我的困惑来自于m_ex_A,B和C被分配给堆栈而不是动态的,但它们被分配给动态对象?
我的猜测是使用delete到m_ex_A,B,C对象,因为我已经动态初始化了它们?
使用堆内存还是堆栈更有效率?
我想我可能会使用动态内存...
你绝对应该删除你动态分配的对象.也可以做它的析构者MainClass,但就个人而言,我认为这是一种糟糕的风格.为什么?因为您在不同的地方,在不同的实体中分配和删除.实际上,您正在转移这些对象的所有权,因此您应该非常小心,不要删除两次或其他内容.我宁愿使用shared_ptr或unique_ptr放弃我对所有这些微观管理的看法.您可以搜索网络上的那些,它们非常易于使用.
至于第二个问题 - 你必须只删除一次对象.复制指针不会创建新对象,它只是指向同一对象的另一个指针.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |