1

重複の可能性:
デストラクタがコンストラクタよりも頻繁に呼び出されるように見えるのはなぜですか?

ID を使用してインスタンスを注文する必要がstatic sCounterあります。int id

それらをベクトルでグループ化すると、これはうまく機能します..IDは正しく設定されています:

Task t("1st Task");
Task t2("2nd Task");
    Task t3("3rd Task");

std::vector<Task> myTasks;
myTasks.push_back(t);
myTasks.push_back(t2);
myTasks.push_back(t3);

タスク番号 1 の ID は 0、2 番目のタスクは ID 1、3 番目のタスクは ID 2 です。しかし、これを行うと:

std::vector<Task> myTasks;

myTasks.push_back(
   Task("First Task"));
myTasks.push_back(
   Task("Second Task"));
myTasks.push_back(
   Task("Third Task"));

静的な sCount 値が奇妙な結果を出し始めます。

最初のものは ID 1 を取得し、2 番目も ID 1 を取得し、3 番目は ID 0 を取得します。

このようなオブジェクトを作成すると、静的カウンターが混乱するのはなぜですか?

sCounter はコンストラクタで増加し、デストラクタで減少します。

int Task::sCount = 0;

Task::Task(std::string text) {
    this->setText(text);
    this->setStatus(1);
    time_t now = time(0);
    timestamp = *localtime(&now);
    std::cout << "Count from " << sCount;
    sCount++;
    std::cout << " to --> " << sCount << "\n";
    this->setID(); // set the current sCount to ID
}
Task::~Task() {
    --sCount;
}

sCounter はプライベートな静的 int です。static int sCount;

4

2 に答える 2

3

デストラクタは正常に機能しますが、何かをプッシュすることに関係するコピーコンストラクタはカウンタをインクリメントしません。

カウンターを処理する明示的なコピーコンストラクターを実装するだけです。

于 2012-10-08T19:33:33.003 に答える
1

2 番目のケースでは、push_back に渡される各 Task インスタンスは一時変数です。これは、push_back の呼び出しが完了すると、デストラクタが呼び出されることを意味します。次に、デストラクタは、次のタスクが作成される前にカウンターをデクリメントします。

myTasks.push_back( Task("First Task") ); // Task's destructor is called before the next line

Task はベクターにコピーされますが (そのため、データはメモリ内の別の場所に存在します)、std::vector がこれに使用する暗黙のコピー コンストラクターはカウンターをインクリメントしません。

于 2012-10-08T19:38:28.207 に答える