しばし疑問に思ったのですが、
new
キーワードを使用して、関数への引数として同じポインターを渡すと同時に、オブジェクトのインスタンスへのポインターを作成できることを知っています。以下の例に示すように、Animation::newFrame
関数で以下のようにします。
ただし、原則として、delete
を使用して作成したものを呼び出すのは自分の責任であることも認識していますnew
。
したがって、Frame のコンストラクターを次のように呼び出すと、次のようになります。
Frame* myFrame
= new Frame(new point(0,0), new point(100,100), new point(50,20));
new
上記の関数呼び出しで作成した 3 つのポイントのメモリを最終的に解放する責任はどこにありますか?
結局のところ、上記の 3 つの新しいポイントには、私が呼び出す名前が正確にはありませんdelete
。
私は常に、それらが呼び出された関数のスコープに属していると想定してきましたが、それらは単に関数のスコープから外れます。しかし、そうではないのではないかと最近思うようになりました。
ここで十分に明確になったことを願っています。
前もって感謝します、
男
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;
}
};
編集:この質問は純粋に理論的なものであることを忘れていました。スマート ポインターなどの生のポインターに代わるはるかに優れた代替手段があることを認識しています。通常のポインターとその管理方法についての理解を深めたいという単純なお願いです。
また、上記の例は、実際には C++/cli と c++ が混在する (マネージド クラスとアンマネージド クラス) である私のプロジェクトから取得したものです。そのため、コンストラクターは値のみを受け入れpoint*
、値を渡さないのです ( point
)。はアンマネージ構造であるためpoint
、マネージ コード内で使用する場合は、プログラマーである私自身が管理する必要があります。:)