В 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
с динамической памятью удаление его является неопределенным поведением.
так что нет необходимости беспокоиться об удалении A
S данные, как он будет уничтожен из памяти вместе с экземпляром класса.
у вас есть только один указатель на A
. Поэтому вам нужно только удалить это:
~B() {
delete ptr2A;
}
обратите внимание, что вы не можете delete
b1, так как это простой int
! (Память, занимаемая переменными структуры, такими как b1
и указатель ptr2A
сам (не то, на что он указывает) уничтожается автоматически вместе с любыми экземплярами этой структуры.)