Я написал следующий фиктивный класс, чтобы понять, как конструктор копирования, оператор копирующего присваивания и деструктор работы:динамическое распределение памяти, члены указателей и деструкторы
#include <string>
#include <iostream>
class Box {
public:
// default constructor
Box(int i=10,const std::string &t=std::string()) : a(i),s(new std::string(t)) {}
// copy constructor
Box(const Box &other) { a=other.a; s=new std::string(*other.s); }
// copy assignment operator
Box &operator=(const Box &other) { a=other.a; s=new std::string(*other.s); }
// destructor
~Box() { std::cout<<"running destructor num. "<<++counter<<std::endl; }
int get_int() { return a; }
std::string &get_string() { return *s; }
private:
int a;
std::string *s;
static int counter;
};
int Box::counter=0;
Я использую в своем коде этот тип класса чтобы проверить, как это работает, но я думал о последствиях в уничтожении объектов, имеющих член встроенного типа указателя:
#include "Box.h"
using namespace std;
int main()
{
Box b1;
Box b2(2,"hello");
cout<<b1.get_int()<<" "<<b1.get_string()<<endl;
cout<<b2.get_int()<<" "<<b2.get_string()<<endl;
Box b3=b1;
Box b4(b2);
cout<<b3.get_int()<<" "<<b3.get_string()<<endl;
cout<<b4.get_int()<<" "<<b4.get_string()<<endl;
b1=b4;
cout<<endl;
cout<<b1.get_int()<<" "<<b1.get_string()<<endl;
{
Box b5;
} // exit local scope,b5 is destroyed but string on the heap
// pointed to by b5.s is not freed (memory leak)
cout<<"exiting program"<<endl;
}
Этот указатель инициализируется в конструкторе, чтобы указать на (всегда новый) динамически распределяемой память в свободном магазине. Поэтому, когда вызывается деструктор, члены объекта, подлежащего уничтожению, уничтожаются в обратном порядке. Правильно ли в этом случае, что уничтожаются только объекты int и указателя, и я получаю утечку памяти (строка в куче не освобождается)?
Кроме того, определяя этот оператор присваивания копии, у меня есть утечка памяти каждый раз, когда я назначаю объект (указатель указывает на новый объект в куче, а первый потерян, не так ли?)?
Имеет посмотрите здесь: http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three –
И да, ваш код просачивается, как сито. –
@ πάνταῥεῖ да, вот и весь смысл .. – Luca