2013-11-13 2 views
0

Где-то в моем коде я вызываю: A* p = new A; и помещаю указатель p в вектор.C++ как удалить класс с помощью указателя на класс

Теперь я хочу удалить указатель и класс, на который указывает указатель. так:

A* p = getpointerfromvector(index); // gets the correct pointer 

Удалить указатель из вектора:

vector.erase(vector.begin()+index) 

Теперь я хочу, чтобы удалить класс указатель, указывающий на и удалить его.

delete p; // (doest work: memorydump) 

или p->~A с ~A деструктор класса А с телом: delete this;. (моя программа закрывается всякий раз, когда я вызываю функцию.)

+2

Небольшое уточнение по номенклатуре: В вашем случае 'A' это имя класса, в то время как' p' является указателем на объект. Когда вы делаете 'new A', вы создаете новый * объект *, а не новый * класс *. Важно оставить понятия класса и объекта отдельно :) –

+0

Пожалуйста, покажите полный, компилируемый пример, демонстрирующий проблему. –

+1

'delete p' верен. Если это не сработает, опубликуйте [sscce] (http://sscce.org/), демонстрируя проблему. – interjay

ответ

2

Это работает для меня. Не могу сравнить его с вашим кодом, так как его не все в вашем посте.

#include <stdio.h> 
#include <vector> 

using std::vector; 

class A 
{ 
public: 
    A() {mNum=0; printf("A::A()\n");} 
    A(int num) {mNum = num; printf("A::A()\n");} 
    ~A() {printf("A::~A() - mNum = %d\n", mNum);} 
private: 
    int mNum; 
}; 

int main() 
{ 
    A *p; 
    vector <A*> aVec; 
    int i, n=10; 
    for (i=0; i<n; i++) 
    { 
     p = new A(i); 
     aVec.push_back(p); 
    } 
    int index = 4; 
    p = aVec[index]; 
    aVec.erase(aVec.begin()+index); 
    delete(p); 
} 

Выход:

A::A() 
A::A() 
A::A() 
A::A() 
A::A() 
A::A() 
A::A() 
A::A() 
A::A() 
A::A() 
A::~A() - mNum = 4 
+0

Я забыл изменить свой деструктор на ~ A {} вместо ~ A {delete this} – user2321611

+1

Легко сделано. Это просто для такого рода оплошностей, что вы всегда должны стремиться опубликовать пример SSCCE - Short Self Contained Correctable (Compilable). (Http://www.sscce.org/) – enhzflep

Смежные вопросы