【问题标题】:C++ returning a vector/map of pointers from a public member functionC++ 从公共成员函数返回指针的向量/映射
【发布时间】:2011-11-24 19:04:54
【问题描述】:

关于从类中的公共成员函数返回指向向量或指针映射的指针的含义,我有一个简短的问题。

这是我的代码:

这是B类的成员函数

vector<A*>* ClassB::getfunction(){
    returns m_test;
}

m_test 是 B 类的私有数据成员,类型为指向指针向量的指针。该对象将在堆上初始化,因此我需要在类析构函数中将其删除(包括向量中的所有元素)。

然后我会使用如下所示的函数。

B* ex_B = new B();

vector<A*>* ex_ptr_vecA = new vector<A*>;  

ex_ptr_vecA = ex_B->getfunction();

我的问题:

由于我有两个内存都分配在堆上的对象,我需要同时删除它们吗?

顺序是否重要,以下是否正确?

B* ex_B = new B();

vector<A*>* ex_ptr_vecA = new vector<A*>;  

ex_ptr_vecA = ex_B->getfunction();

//do something with ex_ptr_vecA
//Then I want to delete the allocate memory to the heap

//delete class B first
delete ex_B;

//and then the vector
//need to loop over vector elements and delete one at a time
for(int i =0; i < ex_ptr_vecA; i++){
     delete ex_ptr_vecA->at(i);
}

delete ex_ptr_vecA;

这是正确的还是我试图删除悬空指针,因为 B 类的析构函数已经释放了堆内存?

【问题讨论】:

    标签: c++


    【解决方案1】:
    B* ex_B = new B();
    vector<A*>* ex_ptr_vecA = new vector<A*>;
    

    在这里,您分配了 2 个内存块,并将这些块的开头地址存储在相应的指针变量中。一切都好。

    ex_ptr_vecA = ex_B->getfunction();
    

    现在您已经使用getfunction() 返回的任何地址重新分配了 ex_ptr_vecA。你不再持有新的vector&lt;A*&gt; 返回的地址,你不能再释放它,因此你有内存泄漏。

    如果您只需要指向ex_B 的内部vector&lt;A*&gt; 的指针,那么只需这样说:

    vector<A*>* ex_ptr_vecA = ex_B->getfunction();
    

    您在示例代码ex_ptr_vecA 中显示的方式指向您在ex_B 类中分配的同一个向量。如果ex_B 在其析构函数中删除了该内部向量,那么delete ex_ptr_vecA; 意味着您要删除两次——这是未定义的行为。

    【讨论】:

      【解决方案2】:

      虽然我不认为这条线

      ex_ptr_vecA = ex_B->getfunction();
      

      编译(您分配“指针向量”=>“指向指针向量的指针”),您只需要两次删除。 B 拥有 ex_ptr_vecA 中返回的指针,因此只有它自己负责销毁它。您的代码已更正:

      B::B() : m_test( new vector<A*>() ) {}
      B::~B() { delete m_test; }
      
      B* ex_B = new B();
      vector<A*>* ex_ptr_vecA;
      ex_ptr_vecA = ex_B->getfunction();
      // Do something
      delete ex_B;
      

      你看,这段代码的重点是每个新的在同一级别的代码中都有一个删除,以便于考虑分配和解除分配。为了进一步简化这一点,请阅读 RAII。

      【讨论】:

      【解决方案3】:

      任务

      ex_ptr_vecA = ex_B->getfunction();
      

      由于分配的内存会导致内存泄漏

      new vector<A*>
      

      届时将无法访问。将没有指向该内存的指针,因此您没有机会释放它...

      我建议您使用共享智能指针,然后您就可以忘记释放分配的内存以及您应该执行的顺序。

      【讨论】:

      • 我删除ClassB后是不是这样,因为classB的析构函数释放了内存?
      • 为什么new vector分配的内存无法访问?
      • 因为该内存上的指针将被 getfunction() 返回的另一个指针覆盖...
      猜你喜欢
      • 1970-01-01
      • 2013-06-14
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多