Я часто задавался вопросом,Что несет ответственность за удаление моего указателя?
Я знаю, что могу создать указатель на экземпляр объекта в то же время, проходя тот же указатель в качестве аргумента функции, используя ключевое слово new
. Как и у меня ниже в функции Animation::newFrame
, приведенной в примере ниже.
Однако я также знаю, что, как правило, я несу ответственность за то, что вы вызываете delete
на то, что я создаю, используя new
.
Так что, когда я называю конструктор кадра следующим образом:
Frame* myFrame
= new Frame(new point(0,0), new point(100,100), new point(50,20));
Где ответственность в конечном итоге освободить память для 3-х точек, я создал с помощью new
в приведенном выше вызове функции лежат?
В конце концов, вышеупомянутые 3 новых пункта точно не имеют имен для меня, чтобы позвонить delete
.
Я всегда считал, что они принадлежат к сфере функции, в которую они вызваны, и они просто выйдут из сферы действия с помощью функции. Однако в последнее время я думал, что это не так.
Надеюсь, я здесь был достаточно ясен.
Спасибо заранее,
Guy
struct Frame
{
public:
point f_loc;
point f_dim;
point f_anchor;
//the main constructor:: Creates a frame with some specified values
Frame(point* loc, point* dim, point* anchor)
{
f_loc = loc;
f_dim = dim;
f_anchor = anchor;
}
};
struct Animation
{
public:
vector<Frame*> frameList;
//currFrame will always be >0 so we subtract 1
void Animation::newFrame(int &currFrame)
{
vector<Frame*>::iterator it;//create a new iterator
it = frameList.begin()+((int)currFrame);//that new iterator is
//add in a default frame after the current frame
frameList.insert(
it,
new Frame(
new point(0,0),
new point(100,100),
new point(50,20)));
currFrame++;//we are now working on the new Frame
}
//The default constructor for animation.
//Will create a new instance with a single empty frame
Animation(int &currFrame)
{
frameList.push_back(new Frame(
new point(0,0),
new point(0,0),
new point(0,0)));
currFrame = 1;
}
};
EDIT: Я забыл упомянуть, что этот вопрос носит чисто теоретический характер. Я знаю, что есть намного лучшие альтернативы исходным указателям, таким как интеллектуальные указатели. Я прошу просто углубить свое понимание обычных указателей и как управлять ими.
также приведенный выше пример взят из проекта шахты, что на самом деле C++/CLI и C++ смешанного (управляемые и неуправляемые классы), так что почему застройщик принимает только point*
и не проходя по значению (point
). Потому что point
является неуправляемой структурой, поэтому, когда он используется в управляемом коде, должен управляться мной, программистом. :)
этот код невозможно скомпилировать. несоответствие типов: f_loc = loc; также -1. вы должны были попытаться построить его самостоятельно. – thang
Именно поэтому такие вещи должны передаваться по значению (а не создаваться «новым» на первом месте). Если вы создадите их с помощью 'new ', вы должны в любой момент вызвать' delete'on. – Hulk
Почему вы настаиваете на выделении объектов в кучу (с помощью 'new')? Почему бы не использовать временные объекты, например: «Frame myFrame (точка (0,0), точка (100 100), точка (50,20));'. Это дешевле, потому что это позволяет избежать дорогостоящих распределений кучи и проблем с распределением памяти, которые вы наблюдали. – Andrzej