Note that there are some explanatory texts on larger screens.

plurals
  1. POCan't delete and erase object pointer on a vector
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

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