【问题标题】:C++ deleting pointer to a pointer when passing to a classC ++在传递给类时删除指向指针的指针
【发布时间】:2012-01-05 00:43:15
【问题描述】:

我有一些代码供大师检查。我知道这可能(绝对)不是删除内存的最佳方法,但请告诉我它是否可以。

我知道我应该使用智能指针,但我将在我的代码的下一个版本中这样做。

无论如何,这是我的问题。

我有一个每次循环启动的课程。我将此类指针传递给指向对象的指针向量,该对象在循环的每次迭代中也会发生变化。例如

vector<A*>* ex_A

然后我在类中使用这些指向向量的指针,并使用

将它们相互映射
map< int, vector<B*>* >*  ex_map.

然后可以通过公共成员函数之一通过类访问这个新地图。

在循环结束时,我希望删除内存,以便可以实例化下一个新类而不会出现段错误。

这是我正在做的一些示例代码:

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) {}

MainClass::MakeMap(){

 vector<A*>::iterator itr_A = m_ex_A->begin();
 for(; itr_A != m_ex_A->end(); itr_A++){

    //This member function returns a vector of B* that are dependent of A
    vector<B*>* dependent_B = changeVectorB((*itr_A));

    /Defined in Header File
    //map< int, vector<B*>* >* m_mapAofB;
    //Now get Map index of A with vector of B*
    (*m_mapAofB)[(*itr_A)->Inedx()] = dependent_B;

   }

}

我想在某个时候删除 m_mapAofB,所以我会循环遍历地图的每个值(这是指向指针向量的指针)。我使用类似于这个 URL 的东西来实现这一点。

C++ Generic code for deleting pointer value in Map and vector of pointers

我主要关心的是何时删除此内存,因为 MainClass 将处于 for 循环中。我是否应该在 for 循环的每次迭代结束时删除内存。这将允许 MainClass 的新实例化??

例如

for(int i = 0; i < 100000; i++){
     //This will also change each loop
     Vector<A*> ex1;
     Vector<B*> ex2;         
     Vector<C*> ex3;

     MainClass* ex_main = new MainClass(ex1,ex2,ex3);


     ///Do something....

     //Finished with class now delete pointers
     ex_main->DeleteMemory();

     delete ex_main;
}

【问题讨论】:

  • 首先,我要说的是,在循环的每次迭代中分配和释放内存都会对性能造成巨大影响。因此,就您的代码而言,我建议重新设计代码的工作方式,以允许在每次迭代中重用该类。
  • @Slade 什么是更好的解决方案?我正在尝试管理我的内存,因此我不会因为内存泄漏而获得任何 seq vault?
  • 'new' 创建的类型在编译时是已知的,'MainClass' 对象的生命周期在 ex1、ex2 和 ex3 的生命周期内。所以你可以将 MainClass 实例化为一个局部变量 (MainClass ex_main(ex1, ex2, ex3)。它会快得多,因为可能会跳过新/删除调用。

标签: c++


【解决方案1】:

我不允许 MainClass 的新实例化,这是已经允许的,它会释放你应该做的内存。所以,是的,去做吧。

【讨论】:

    【解决方案2】:

    我在很多层面上对此感到困惑,并认为它需要重新设计 - 但除此之外:

    你说:

    因为 MainClass 将处于 for 循环中。我应该在 for循环的每次迭代结束。这将允许新 MainClass 的实例化??

    那么,如果您计划在每次迭代结束时删除与其相关的内存,为什么您认为首先需要动态分配 MainClass?它可以简单地是一个堆栈变量,它在循环顶部创建并在每次循环时销毁(或者更好的是,如 Slade 的评论中所述,您可以在循环上方声明它,这样它就不会每次都重新创建 - 那需要你有一个公共函数来改变它来模仿它的构造函数)。其次,将您的指针包装在对象中(我不在乎它们是否是真正的智能指针,只需将它们包装起来),因此当您的向量超出范围时,您的包装器析构函数将自动删除动态分配的内容。

    【讨论】:

    • 所以如果我将指针包装在类析构函数中而不是 DeleteMemory() 函数中,那么当我使用 delete 时会调用析构函数?
    • 坦率地说,您应该只切换到 TR1::shared_ptr,但由于您还没有准备好... A 类{};类 APtr { APtr(A* ptr): m_ptr(ptr) {} ~APtr() { 删除 ptr; } };你会好吗。改为执行 std::vector APtrs(保存指向 A 的指针),当向量超出范围时,它将调用 APtr 的析构函数,该析构函数将删除它持有的指针。
    • PS:你可以为所有类 {A,B,C,...} 创建一个类模板,假设它们都只使用 T 类型的指针存储它,然后删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2013-03-04
    • 1970-01-01
    • 2020-06-24
    • 2013-04-14
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多