Note that there are some explanatory texts on larger screens.

plurals
  1. POCan't delete and erase object pointer on a vector
    text
    copied!<p>I need to delete and erase object pointer on a vector. I see this question <a href="https://stackoverflow.com/questions/3733081/should-we-delete-before-or-after-erase-for-an-pointer-in-the-vector">Should we delete before or after erase for an pointer in the vector?</a> but I can't erase after delete object pointer.</p> <p>How to fix it? Here my code.</p> <pre><code>#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; class Foo { public: class bar { public: Foo &amp;_owner; int _id; bar(Foo &amp;owner,int id) : _id(id), _owner(owner){} void remove() { for(vector&lt;bar*&gt;::iterator it=_owner.vbar.begin();it&lt;_owner.vbar.end();it++) { if((*it)-&gt;_id == _id) { //delete object pointer delete * it; //remove element it = _owner.vbar.erase(it); // error on this line. } } } }; vector&lt;bar*&gt; vbar; Foo() { // add 10 elements for(int i=0;i&lt;10;i++) vbar.push_back(new bar(*this ,i)); // remove element at 3 vbar.at(3)-&gt;remove(); } }; int main(int argc, char *argv[]) { Foo foo; return 0; } </code></pre> <hr> <p><strong><em>[Edited]</em></strong> I fixed this by delete object pointer from outside Bar class(delete on Foo class) by adding no longer use bar id to vector on Foo class like this.</p> <pre><code>#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; class Foo { public: class bar { public: Foo &amp;_owner; int _id; bar(Foo &amp;owner,int id) : _id(id), _owner(owner) {} void remove() { _owner.removeId = _id; _owner.removeHelper(); } }; vector&lt;bar*&gt; vbar; int removeId; Foo() { removeId = -1; // add 10 elements for(int i=0; i&lt;10; i++) vbar.push_back(new bar(*this ,i)); // remove element at 3 vbar.at(3)-&gt;remove(); } void removeHelper() { for(vector&lt;bar*&gt;::iterator it=vbar.begin(); it&lt;vbar.end(); it++) { if((*it)-&gt;_id == removeId) { //delete object pointer delete * it; //remove element it = vbar.erase(it); break; } } removeId = -1; } }; int main(int argc, char *argv[]) { Foo foo; return 0; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload