В C++, как написать деструктор для освобождения памяти указатель на структуру?

вот моя структура a

struct A {
    int a1;
    int a2;
    ~A() { }
};

B - еще одна структура, содержащая указатель на

 struct B {
    B(int b, A* a)
      : b1(b), ptr2A(a)
    {}
    int b1;
    A* ptr2A;

    ~B() {
         delete b1;
         // traverse each element pointed to by A, delete them <----
    }
};

позже я использую ниже код

int bb1;
vector <A*> aa1;
// do some stuff
B *ptrB = new B(bb1, aa1);

мне нужно удалить / освободить всю память, на которую указывает ptrB. Следовательно, мне нужно написать правильный деструктор внутри структуры B. Как мне пройти каждый элемент, на который указывает A, и удалить их?

3 ответов


Если вы используете компилятор C++11, просто используйте std:: shared_ptr, и вам не нужно беспокоиться об удалении. Это связано с тем, что shared_ptr является "умным" указателем, который автоматически удалит то, на что он указывает.

#include <memory>
struct B 
{
    int b1;
    std::shared_ptr<A> ptr2A;
    B(int b, std::shared_ptr<A> a):b1(b),ptr2A(a)({}
    ~B(){} //look ma! no deletes!
};

используйте общий указатель всякий раз, когда вы выделяете что-то:

#include<memory>
...
{
    ....
    std::shared_ptr<B> ptrB( new B(bb1, aa1) );
    //Here is another, more readable way of doing the same thing:
    //auto ptrB = std::make_shared<B>(bb1,aa1);
    ...
}
//no memory leaks here, because B is automatically destroyed

вот больше информации на тему умных указателей.

Я должен также упомянуть, что если у вас нет компилятора C++11, вы можете получить общий указатели от библиотека.


вам нужно только delete объектов, выделенных new. В этом случае нет необходимости удалять b1 как он не был динамически выделен. Более того, если вы не инициализировали ptr2a с динамической памятью удаление его является неопределенным поведением.

так что нет необходимости беспокоиться об удалении AS данные, как он будет уничтожен из памяти вместе с экземпляром класса.


у вас есть только один указатель на A. Поэтому вам нужно только удалить это:

~B() {
     delete ptr2A;
}

обратите внимание, что вы не можете delete b1, так как это простой int! (Память, занимаемая переменными структуры, такими как b1 и указатель ptr2A сам (не то, на что он указывает) уничтожается автоматически вместе с любыми экземплярами этой структуры.)