4

私は大学のシステムプログラミングコースの宿題としてプロジェクトに取り組んでいます。ポインタ、ベクトル、スタック、ヒープの問題に本当に混乱しました。

C++を使用します。コースであるオブジェクトのベクトルを取得する必要があります。これらのコースオブジェクトには、いくつかの異なるフィールドがあります。私がしたことはこれでした:

vector<CoursesObject> coursevector;

次に、Courses Objectクラスを作成しました。このクラスには、コースに残っているスペースとコースフィールドの名前が含まれています。今、私は新しいコースを追加したいと思います、私はします:

CoursesObject *theCourse = new CoursesObject(name, space);

今、私はそれをハンドラーベクトルに追加したいと思います:

coursevector.push_back(*theCourse);

私が知っていることはすべて、スタック上にCoursesオブジェクトのベクトルを作成し、ヒープ上にある新しいコースへの新しいポインターを作成し、ヒープ内のコースオブジェクトを指すポインターtheCourseをハンドラーベクトルに追加しました。私が言ったことは正しいですか?

これらのコースオブジェクトを削除しようとすると、次のようになります。

for(int i=0; i<coursevector.size(); i++)
    delete coursevector.at(i);

これは、ポインタではないというエラーを表示します。しかし、コースベクトルにコースオブジェクトへのポインターを追加していませんか?

誰かが説明してください、私はメモリを正しく処理する必要があり、私はそれを正しく理解していないようです。

4

5 に答える 5

5

これ

vector<CoursesObject> coursevector;

は のベクトルなCourseObjectsので、CourseObjectポインタを保持できません。これを行う場合:

coursevector.push_back(*theCourse);

ベクトルに格納されているCoursesObjectbyのコピーを取得します。theCourseベクターからエントリを削除する必要はありません。実際、ポインターを保持していないため、できません。

動的割り当てを回避した場合、プログラムははるかに簡単になります。

coursevector.push_back(CoursesObject(name, space));
于 2012-11-03T15:15:12.087 に答える
4

new を使用する必要はまったくありません。

//This vector stores CoursesObject objects,
//not pointers to CoursesObjects.
vector<CoursesObject> coursevector;
//Construct theCourse with automatic storage
//duration.
CoursesObject theCourse(name, space);
//Copy theCourse into coursevector
coursevector.push_back(theCourse);
//theCourse will be automatically destroyed.
//coursevector (and all the objects that it contains)
//will be automatically destroyed.
于 2012-11-03T15:19:59.540 に答える
0

coursevectorsのみを保持でき、CoursesObjects へのポインターは保持できCoursesObjectないため、演算子を使用する必要はありませんnew(@Mankarse の回答を確認してください)。ただし、引き続きポインターを保持する場合は、coursevector の定義を次のように変更します。

vector<CoursesObject*> coursevector;

ポインタの値をそのまま push_back します。

coursevector.push_back(theCourse);
于 2012-11-03T15:25:41.720 に答える
0

これを行うとき:

coursevector.push_back(*theCourse);

実際にはポインタ theCourse を逆参照しているので、オブジェクトのコピーを追加しています。CourseObject ポインターのベクトルを宣言する必要があります。

vector<CoursesObject *> coursevector;

次に、オブジェクトを追加します。

coursevector.push_back(theCourse);

これで、オブジェクトを削除するコードが機能するはずです:

for(int i=0; i<coursevector.size(); i++)
    delete coursevector.at(i);
于 2012-11-03T15:25:06.577 に答える
0

すべてのオブジェクトが動的に割り当てられるわけではないため、プログラム中にいつでも削除することはできません。動的に割り当てられたオブジェクトのみを削除できることに注意してください。

int Var1 = 0;  //cannot be deleted, scope and life will exist for the life of program
int * Var2 = new int; //CAN be deleted, dynamically allocated.

delete Var2; //free memory

ただし、ポインターである最後のオブジェクトを削除することはできます。ベクトルの最後の要素を取得し、delete を呼び出します (これはクラスへのポインターである必要があります)。

于 2012-11-03T15:18:19.730 に答える