在将指针指向指针(并将指针传递给类)时使用delete进行C++混淆

MWr*_*ght 0 c++

很抱歉,如果我的上一个问题非常相似,但我还有另一个查询,说明何时以及是否应该使用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对象,因为我已经动态初始化了它们?

使用堆内存还是堆栈更有效率?

我想我可能会使用动态内存...

Vio*_*ffe 6

你绝对应该删除你动态分配的对象.也可以做它的析构者MainClass,但就个人而言,我认为这是一种糟糕的风格.为什么?因为您在不同的地方,在不同的实体中分配和删除.实际上,您正在转移这些对象的所有权,因此您应该非常小心,不要删除两次或其他内容.我宁愿使用shared_ptrunique_ptr放弃我对所有这些微观管理的看法.您可以搜索网络上的那些,它们非常易于使用.

至于第二个问题 - 你必须只删除一次对象.复制指针不会创建新对象,它只是指向同一对象的另一个指针.

  • 不,你只在一个地方删除它!如果你删除它两次,那就是你不想访问的地方UB(未定义行为) (2认同)