auto_ptr 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第16章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① 次のプログラムを、auto_ptr を使って書き直してください。

#include <iostream>

void Print(const int* n)
{
    if (n == NULL) {
        std::cout << "NULL" << std::endl;
    }
    else {
        std::cout << *n << std::endl;
    }
}

int main()
{
    const int* const n = new int(100);

    Print(n);

    delete n;
}

const の使い方や、Print関数の引数の型に注意が必要です。

#include <iostream>
#include <memory>

void Print(const std::auto_ptr<int>& n)
{
    if (n.get() == NULL) {
        std::cout << "NULL" << std::endl;
    }
    else {
        std::cout << *n << std::endl;
    }
}

int main()
{
    const std::auto_ptr<int> n(new int(100));

    Print(n);
}

実行結果

100

元のコードでは、int* ではなく const int* にしているので、それに合わせて、auto_ptr の管理する型も constポインタにしてください。これは、auto_ptr自身を const にするのではなく、テンプレート実引数を constポインタにするということです。

それはそれとして、auto_ptr 自身も const にしています。これは、元のコードでいうと「const int* const n」の2つ目の const に対応したものです。

Print関数の引数の型を、const参照の auto_ptr にしています。ここも重要で、普通に auto_ptr を実体で渡してしまうと、破壊的コピーが起きて、呼び出し元の auto_ptr が所有権を失ってしまいます。結果として、ポインタが指す先の値を出力したいだけの関数であるにも関わらず、領域の解放まで行われてしまいます。


参考リンク


更新履歴

’2016/1/31 新規作成。



第16章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る